﻿<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory">Chapter 17. Configuration</title>
	<link rel="stylesheet" href="css/espertech.css" type="text/css">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" name="generator" content="DocBook XSL-NS Stylesheets V1.74.0">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<link rel="home" href="index.html" title="Esper Reference">
	<link rel="up" href="index.html" title="Esper Reference">
	<link rel="prev" href="apiruntime.html" title="Chapter 16. Runtime Reference">
	<link rel="next" href="inlinedclass.html" title="Chapter 18. Inlined Classes">
</head>

<body>
	<p xmlns:d="http://docbook.org/ns/docbook" id="title">
		<a href="./index.html" class="site_href"><strong>www.espertech.com</strong></a><a href="http://www.espertech.com/esper/esper-documentation/" class="doc_href"><strong>文档</strong></a>
	</p>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="apiruntime.html"><strong>上一页</strong></a></li>
		<li class="next"><a accesskey="n" href="inlinedclass.html"><strong>下一页</strong></a></li>
	</ul>
	<div class="chapter" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="configuration"></a>第17章. 配置</h2>
				</div>
			</div>
		</div>
		<div class="toc">
			<dl>
				<dt><a href="configuration.html#configuration-overview">17.1. 概述</a></dt>
				<dt><a href="configuration.html#configuration-programmatic">17.2. 编程式配置</a></dt>
				<dt><a href="configuration.html#configuration-xml">17.3. 通过XML文件配置</a></dt>
				<dt><a href="configuration.html#configuration-common">17.4. 通用配置</a></dt>
				<dd>
					<dl>
						<dt><a href="configuration.html#configuration-common-annotationimports">17.4.1. 注解类和包导入</a></dt>
						<dt><a href="configuration.html#configuration-common-imports">17.4.2. 类和包导入</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypebean">17.4.3. 由类表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypemap">17.4.4. 由java.util.Map表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypeobjectarray">17.4.5. 由Object[]（对象数组）表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypejson">17.4.6. 由JSON表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypeavro">17.4.7. 由Avro GenericData.Record表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypexmldom">17.4.8. 由org.w3c.dom.Node表示的事件</a></dt>
						<dt><a href="configuration.html#configuration-common-eventmeta">17.4.9. 事件类型默认值</a></dt>
						<dt><a href="configuration.html#configuration-common-eventtypeautoname">17.4.10. 事件类型导入包（事件类型自动命名）</a></dt>
						<dt><a href="configuration.html#configuration-common-methodinvocations">17.4.11. From子句方法调用</a></dt>
						<dt><a href="configuration.html#configuration-common-databaseref">17.4.12. 关系型数据库访问</a></dt>
						<dt><a href="configuration.html#configuration-common-logging">17.4.13. 与日志记录相关的通用设置</a></dt>
						<dt><a href="configuration.html#configuration-common-timesource">17.4.14. 与时间源相关的通用设置</a></dt>
						<dt><a href="configuration.html#configuration-common-variables">17.4.15. 变量</a></dt>
						<dt><a href="configuration.html#configuration-common-variantstream">17.4.16. 变体流</a></dt>
					</dl>
				</dd>
				<dt><a href="configuration.html#configuration-compiler">17.5. 编译器配置</a></dt>
				<dd>
					<dl>
						<dt><a href="configuration.html#configuration-compiler-bytecode">17.5.1. 与字节码生成相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-viewresources">17.5.2. 与视图资源相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-logging">17.5.3. 与日志记录相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-streamselection">17.5.4. 与流选择相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-language">17.5.5. 与语言和区域设置相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-expression">17.5.6. 与表达式求值相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-scripts">17.5.7. 与脚本相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-execution">17.5.8. 与语句执行相关的编译器设置</a></dt>
						<dt><a href="configuration.html#configuration-compiler-serde">17.5.9. 与序列化器和反序列化器相关的编译器设置</a></dt>
					</dl>
				</dd>
				<dt><a href="configuration.html#configuration-runtime">17.6. 运行时配置</a></dt>
				<dd>
					<dl>
						<dt><a href="configuration.html#configuration-runtime-threading">17.6.1. 与并发和线程相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-logging">17.6.2. 与日志记录相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-variables">17.6.3. 与变量相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-patterns">17.6.4. 与模式相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-matchrecognize">17.6.5. 与匹配识别相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-timesource">17.6.6. 与时间源相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-jmxmetrics">17.6.7. 与JMX指标相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-metricsreporting">17.6.8. 与指标报告相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-expression">17.6.9. 与表达式求值相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-execution">17.6.10. 与语句执行相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-exceptionhandling">17.6.11. 与异常处理相关的运行时设置</a></dt>
						<dt><a href="configuration.html#configuration-runtime-conditionhandling">17.6.12. 与条件处理相关的运行时设置</a></dt>
					</dl>
				</dd>
				<dt><a href="configuration.html#configuration-transientobjects">17.7. 传递服务或临时对象</a></dt>
				<dd>
					<dl>
						<dt><a href="configuration.html#configuration-transientobjects-service">17.7.1. 服务示例</a></dt>
						<dt><a href="configuration.html#configuration-transientobjects-classforname">17.7.2. 按类名查找</a></dt>
						<dt><a href="configuration.html#configuration-transientobjects-classloader">17.7.3. 类加载器</a></dt>
					</dl>
				</dd>
				<dt><a href="configuration.html#configuration-type-names">17.8. 类型名称</a></dt>
				<dt><a href="configuration.html#configuration-logging">17.9. 日志配置</a></dt>
				<dd>
					<dl>
						<dt><a href="configuration.html#configuration-logging-log4j">17.9.1. Log4j日志配置</a></dt>
					</dl>
				</dd>
			</dl>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-overview"></a>17.1. 概述</h2>
					</div>
				</div>
			</div>
			<a id="d0e46456" class="indexterm"></a><a id="d0e46461" class="indexterm"></a>
			<p>编译时和运行时配置是完全可选的。编译器和运行时在无配置的情况下也能开箱即用。</p>
			<p>
				所有配置都存于 <code class="literal">Configuration</code> 类（<code class="literal">com.espertech.esper.common.client.configuration.Configuration</code>）中。
			</p>
			<p>
				配置类有 <code class="literal">configure</code> 方法，该方法可读取配置 XML 文件，并将 XML 中的信息添加到配置里。你可以累加读取多个 XML 源。
			</p>
			<p>一个配置包含三个部分：</p>
			<div class="itemizedlist">
				<ul compact="compact">
					<li>
						<p>
							通用部分，其配置编译器和运行时都可能会使用，由 <code class="literal">ConfigurationCommon</code> 类表示。
						</p>
					</li>
					<li>
						<p>
							编译器部分，提供仅编译器使用的配置，由 <code class="literal">ConfigurationCompiler</code> 类表示。
						</p>
					</li>
					<li>
						<p>
							运行时部分，提供仅运行时使用的配置，由 <code class="literal">ConfigurationRuntime</code> 类表示。
						</p>
					</li>
				</ul>
			</div>
			<p>
				<code class="literal">Configuration</code> 是一个初始化时的对象。编译器不会保留与配置的任何关联。运行时会提供配置对象的深拷贝（见 <code class="literal">EPRuntime</code> 上的 <code class="literal">getConfigurationDeepCopy</code> 方法），但配置对象一旦提供给运行时就不能再更改。
			</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-programmatic"></a>17.2. 编程式配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e46514" class="indexterm"></a>
			<p>
				你可以通过直接实例化 <code class="literal">Configuration</code> 并在其上添加或设置值来获取一个实例。
			</p>
			<p>以下示例代码添加了一个预配置的事件类型，并在配置的通用部分添加了一个导入项。</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.getCommon().addEventType("PriceLimit", PriceLimit.class.getName());
configuration.getCommon().addImport("org.mycompany.mypackage.MyUtility");</pre>
			<p>
				上述示例添加了一个预配置的事件类型。若要在运行时添加事件类型，请使用 <code class="literal">create schema</code>。
			</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-xml"></a>17.3. 通过 XML 文件配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e46536" class="indexterm"></a>
			<p>除了编程式配置，或者作为一种替代方式，你可以在 XML 文件中指定配置项。</p>
			<p>
				XML 配置文件的默认名称是 <code class="literal">esper.cfg.xml</code>。配置类通过 <code class="literal">configure</code> 方法将该文件作为应用资源从 <code class="literal">CLASSPATH</code> 的根目录读取。
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.configure();</pre>
			<p>
				<code class="literal">Configuration</code> 类也可以从其他源读取 XML 配置文件。<code class="literal">configure</code> 方法接受 <code class="literal">URL</code>、<code class="literal">File</code> 和 <code class="literal">String</code> 类型的文件名参数。
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.configure("myconfigfile.esper.cfg.xml");</pre>
			<p>
				配置文件的模式定义可在 <code class="literal">etc</code> 文件夹中找到，其名称为 <code class="literal">esper-configuration-majorversion-0.xsd</code>。该模式定义可在 <code class="literal">http://www.espertech.com/schema/esper/esper-configuration-majorversion-0.xsd</code> 在线获取，以便工具能自动获取。命名空间是 <code class="literal">http://www.espertech.com/schema/esper</code>。
			</p>
			<p>你可以使用 XML 模式文件来验证你的 XML 配置文件是否有效。</p>
			<p>以下是一个配置文件示例。</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;esper-configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.espertech.com/schema/esper"
    xsi:schemaLocation="
http://www.espertech.com/schema/esper
http://www.espertech.com/schema/esper/esper-configuration-8-0.xsd"&gt;
  &lt;common&gt;
    &lt;event-type name="PriceLimit" class="com.espertech.esper.example.stockticker.event.PriceLimit"/&gt;
    &lt;auto-import import-name="org.mycompany.mypackage.MyUtility"/&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-common"></a>17.4. 通用配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e46599" class="indexterm"></a>
			<p>配置的通用部分既适用于编译器，也适用于运行时。</p>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-annotationimports"></a>17.4.1. 注解类和包导入</h3>
						</div>
					</div>
				</div>
				<p>
					如果你的应用程序有某些类或包仅应在 <code class="literal">@</code> 注解中可见，你可以将它们添加到注解导入列表中。这些类仅在注解中使用时可见，在其他地方不可见。
				</p>
				<p>在 XML 配置文件中，自动导入注解的配置可能如下所示：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;auto-import-annotations import-name="com.mycompany.mypackage.myannotations.*"/&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>以下是通过 API 提供仅注解可用的导入的示例：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration config = new Configuration();
// 包导入，仅在注解中可见
config.getCommon().addAnnotationImport("com.mycompany.mypackage.myannotations.*");</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-imports"></a>17.4.2. 类和包导入</h3>
						</div>
					</div>
				</div>
				<p>
					如 <a class="xref" href="functionreference.html#epl-single-row-function-ref" title="10.1. 单行函数参考">第 10.1 节 “单行函数参考”</a> 所述，EPL 允许在表达式中调用静态 Java 库函数。可以设置此配置项，以便在这类调用中使用部分类名而非全限定类名。导入的工作方式与 Java 文件相同，因此既可以导入包也可以导入类。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select Math.max(priceOne, PriceTwo)
// 通过配置，等同于
select java.lang.Math.max(priceOne, priceTwo)</pre>
				<p>EPL 会自动导入以下 Java 库包。配置文件或通过 API 指定的任何额外导入项，都会添加到以下导入项之外的配置中。</p>
				<div class="itemizedlist">
					<ul compact="compact">
						<li>
							<p>java.lang.*</p>
						</li>
						<li>
							<p>java.math.*</p>
						</li>
						<li>
							<p>java.text.*</p>
						</li>
						<li>
							<p>java.util.*</p>
						</li>
					</ul>
				</div>
				<p>在 XML 配置文件中，自动导入配置可能如下所示：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;auto-import import-name="com.mycompany.mypackage.*"/&gt;
    &lt;auto-import import-name="com.mycompany.myapp.MyUtilityClass"/&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>以下是通过 API 提供导入项的示例：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration config = new Configuration();
config.getCommon().addImport("com.mycompany.mypackage.*");    // 包导入
config.getCommon().addImport("com.mycompany.mypackage.MyLib");   // 类导入
</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypebean"></a>17.4.3. 由类表示的事件</h3>
						</div>
					</div>
				</div>
				<p>如果你想使用普通类来表示事件，本节内容相关。</p>
				<p>
					运行时可以通过 <code class="literal">EPEventService</code> 接口上的 <code class="literal">sendEventBean(Object event, String eventTypeName)</code> 方法处理事件对象。
				</p>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-class"></a>17.4.3.1. JavaBean 风格的类</h4>
							</div>
						</div>
					</div>
					<p>对于具有 getter 方法的 JavaBean 风格的类，请指定事件类型名称和类名或类。接口和抽象类也受支持。</p>
					<p>
						以下示例 XML 配置了一个名为 <code class="literal">StockTick</code> 的事件类型，并提供了全限定类名。
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="StockTick" class="com.espertech.esper.example.stockticker.event.StockTick"/&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>配置的示例代码如下：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
configuration.getCommon().addEventType("StockTick", StockTick.class.getName());</pre>
					<p>或者也可以这样：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">configuration.getCommon().addEventType("StockTick", StockTick.class);</pre>
					<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="warning">
						<h2>警告</h2>
						<p>
							使用超类和接口时，添加事件类型的顺序很重要。请参考 <a class="xref" href="appendix_eventrepbean.html#appendix_eventrepbean_superclassesetc" title="D.6. 超类和接口">第 D.6 节 “超类和接口”</a>。
						</p>
					</div>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-legacy"></a>17.4.3.2. 非 JavaBean 和遗留 Java 事件类</h4>
							</div>
						</div>
					</div>
					<p>当 Java 类中的方法和成员变量名不符合 JavaBean 约定时，可以使用此设置。通过以下配置，任何公共方法和公共成员变量都可以作为事件属性公开。</p>
					<p>可以选择为 Java 类配置一个访问器风格属性。此属性指示编译器应如何公开方法和字段，以便在语句中作为事件属性使用。</p>
					<div class="table">
						<a id="d0e46699"></a>
						<p class="title">
							<b>表 17.1. 访问器风格</b>
						</p>
						<div class="table-contents">
							<table summary="Accessor Styles" border="1">
								<colgroup>
									<col>
									<col>
								</colgroup>
								<thead>
									<tr>
										<th>风格名称</th>
										<th>描述</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><code class="literal">javabean</code></td>
										<td>作为默认设置，编译器会为每个遵循 JavaBean getter 方法约定的公共方法公开一个事件属性</td>
									</tr>
									<tr>
										<td><code class="literal">public</code></td>
										<td>编译器会为给定类的每个公共方法和公共成员变量公开一个事件属性</td>
									</tr>
									<tr>
										<td><code class="literal">explicit</code></td>
										<td>编译器仅为显式配置的公共方法和公共成员变量公开一个事件属性</td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
					<p>
						对于 NEsper .NET，访问器风格为 <code class="literal">NATIVE</code>、<code class="literal">PUBLIC</code> 和 <code class="literal">EXPLICIT</code>。
					</p>
					<p>
						为 <code class="literal">accessor-style</code>（访问器风格）属性使用 <code class="literal">public</code> 设置会指示编译器为 Java 类的每个公共方法和公共成员变量公开一个事件属性。编译器会将事件属性命名为与 Java 类中方法或成员变量相同的名称。
					</p>
					<p>
						例如，假设类 <code class="literal">MyLegacyEvent</code> 公开了一个名为 <code class="literal">readValue</code> 的方法和一个名为 <code class="literal">myField</code> 的成员变量，那么你可以像下面这样使用这些属性。
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select readValue, myField from MyLegacyEvent</pre>
					<p>
						为 <code class="literal">accessor-style</code>（访问器风格）属性使用 <code class="literal">explicit</code> 设置要求通过配置来声明事件属性。这将在下一章中概述。
					</p>
					<p>
						当从 XML 配置文件配置编译器或运行时时，下面的 XML 代码片段演示了 <code class="literal">legacy-type</code>（遗留类型）元素和 <code class="literal">accessor-style</code>（访问器风格）属性的使用。
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyLegacyEvent" class="com.mycompany.mypackage.MyLegacyEventClass"&gt;
      &lt;legacy-type accessor-style="public"/&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>当通过配置 API 配置编译器或运行时时，下面的示例代码展示了如何设置访问器风格。</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
ConfigurationCommonEventTypeBean legacyDef = new ConfigurationCommonEventTypeBean();
legacyDef.setAccessorStyle(AccessorStyle.PUBLIC);
configuration.getCommon().addEventType("MyLegacyEvent", MyLegacyEventClass.class.getName(), legacyDef);</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-properties"></a>17.4.3.3. 为 Java 类指定事件属性</h4>
							</div>
						</div>
					</div>
					<p>有时，在模式和语句中使用由 Java 类中给定的公共方法或成员变量（字段）支持的事件属性可能会很方便。并且声明多个映射到相同方法或成员变量的事件属性也可能很有用。</p>
					<p>
						我们可以通过 <code class="literal">method-property</code>（方法属性）和 <code class="literal">field-property</code>（字段属性）元素来配置事件的属性，如下例所示。
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
      &lt;event-type name="StockTick" class="com.espertech.esper.example.stockticker.event.StockTickEvent"&gt;
        &lt;legacy-type accessor-style="javabean" code-generation="enabled"&gt;
          &lt;method-property name="price" accessor-method="getCurrentPrice" /&gt;
          &lt;field-property name="volume" accessor-field="volumeField" /&gt;
       &lt;/legacy-type&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>
						上面的 XML 配置代码片段声明了一个名为 <code class="literal">price</code> 的事件属性，由名为 <code class="literal">getCurrentPrice</code> 的 getter 方法支持，以及第二个名为 <code class="literal">volume</code> 的事件属性，由名为 <code class="literal">volumeField</code> 的公共成员变量支持。因此，价格和数量属性可以在语句中使用：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select avg(price * volume) from StockTick</pre>
					<p>与所有配置选项一样，也可以使用 API 进行配置：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
ConfigurationCommonEventTypeBean legacyDef = new ConfigurationCommonEventTypeBean();
legacyDef.addMethodProperty("price", "getCurrentPrice");
legacyDef.addFieldProperty("volume", "volumeField");
configuration.getCommon().addEventType("StockTick", StockTickEvent.class.getName(), legacyDef);</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-casesensitivity"></a>17.4.3.4. 大小写敏感性和属性名称</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，编译器以区分大小写的方式解析 Java 事件属性。也就是说，语句中的属性名称必须在名称和大小写方面与 JavaBean 约定的属性名称匹配。此选项控制每个 Java 类的大小写敏感性。</p>
					<p>
						在配置 XML 中，<code class="literal">legacy-type</code>（遗留类型）元素中的可选 <code class="literal">property-resolution-style</code>（属性解析风格）属性可以设置为以下任何值：
					</p>
					<div class="table">
						<a id="d0e46832"></a>
						<p class="title">
							<b>表 17.2. 属性解析大小写敏感性风格</b>
						</p>
						<div class="table-contents">
							<table summary="Property Resolution Case Sensitivity Styles" border="1">
								<colgroup>
									<col>
									<col>
								</colgroup>
								<thead>
									<tr>
										<th>风格名称</th>
										<th>描述</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><code class="literal">case_sensitive (default)</code></td>
										<td>作为默认设置，编译器仅匹配完全相同的名称和大小写的属性名称。</td>
									</tr>
									<tr>
										<td><code class="literal">case_insensitive</code></td>
										<td>如果属性名称相同，则匹配属性。使用不区分大小写的搜索，如果找到完全匹配名称的属性，则选择该属性；如果未找到完全匹配的属性，则选择第一个不区分大小写匹配的属性。</td>
									</tr>
									<tr>
										<td><code class="literal">distinct_case_insensitive</code></td>
										<td>如果属性名称相同，则匹配属性。使用不区分大小写的搜索，并将选择第一个不区分大小写且完全匹配名称的属性。如果有多个“名称”可以映射到该属性，则会抛出异常。</td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
					<p>下面的示例展示了 XML 配置中的此选项，不过也可以通过 API 更改该设置：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
      &lt;event-type name="MyLegacyEvent" class="com.mycompany.package.MyLegacyEventClass"&gt;
        &lt;legacy-type property-resolution-style="case_insensitive"/&gt;
      &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-copymethod"></a>17.4.3.5. 工厂方法和复制方法</h4>
							</div>
						</div>
					</div>
					<p>
						<code class="literal">insert into</code> 子句可以直接实例化并填充你的事件对象。默认情况下，运行时会调用默认构造函数来实例化一个事件对象。要更改此行为，你可以配置一个工厂方法。工厂方法是一个方法名，或者是一个类名加上一个方法名（格式为 class.method），该方法返回类的一个实例。
					</p>
					<p>
						<code class="literal">update</code> 子句可以更改事件对象上的事件属性。为了保持一致性，运行时可能需要通过序列化（实现 <code class="literal">java.io.Serializable</code> 接口）来复制你的事件对象。相反，如果你不希望发生任何复制操作，或者你的应用程序需要控制复制操作，你可以配置一个复制方法。复制方法是事件对象上用于复制该事件对象的方法的名称。
					</p>
					<p>
						下面的示例展示了 XML 配置中的此选项，不过也可以通过 <code class="literal">ConfigurationCommonEventTypeBean</code> 来更改该设置：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyLegacyEvent" class="com.mycompany.package.MyLegacyEventClass"&gt;
      &lt;legacy-type factory-method="com.mycompany.myapp.MySampleEventFactory.createMyLegacyTypeEvent" copy-method="myCopyMethod"/&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>
						复制方法应该是一个不带参数的公共方法，并返回一个新的事件对象（不能返回 <code class="literal">this</code>）。复制方法不能是静态方法，并且不能带参数。
					</p>
					<p>
						与 Sun JVM 结合使用的 <code class="literal">Beacon</code> 数据流操作符，如果类没有默认的无参构造函数，可以使用 <code class="literal">sun.reflect.ReflectionFactory</code>。
					</p>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypebean-startendtimestamp"></a>17.4.3.6. 开始和结束时间戳</h4>
							</div>
						</div>
					</div>
					<p>例如，为了配合日期时间间隔方法使用，你可以让编译器知道你的类的哪个属性携带开始和结束时间戳值。</p>
					<p>
						下面的示例展示了 XML 配置中的此选项，不过也可以通过 API 更改该设置。该示例将提供开始时间戳的属性名称设置为 <code class="literal">startts</code>，将提供结束时间戳的属性名称设置为 <code class="literal">endts</code>：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyLegacyEvent" class="com.mycompany.package.MyLegacyEventClass"&gt;
      &lt;legacy-type start-timestamp-property-name="startts" end-timestamp-property-name="endts"/&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypemap"></a>17.4.4. 由 <code class="literal">java.util.Map</code> 表示的事件</h3>
						</div>
					</div>
				</div>
				<p>
					运行时可以通过 <code class="literal">EPEventService</code> 接口上的 <code class="literal">sendEventMap(Map map, String eventTypeName)</code> 方法处理 <code class="literal">java.util.Map</code> 事件。Map 中的条目表示事件属性。有关如何在运行时使用 <code class="literal">Map</code> 事件的详细信息，请参阅 <a class="xref" href="appendix_eventrepmap.html" title="附录 E. 事件表示：java.util.Map 事件">附录 E，《事件表示：java.util.Map 事件》</a> 部分。
				</p>
				<p>
					你可以为 <code class="literal">Map</code> 事件提供一个事件类型名称。
				</p>
				<p>
					下面的 XML 配置代码片段配置了一个名为 <code class="literal">MyMapEvent</code> 的事件类型。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyMapEvent"&gt;
      &lt;java-util-map&gt;
        &lt;map-property name="carId" class="int"/&gt;
        &lt;map-property name="carType" class="string"/&gt;
        &lt;map-property name="assembly" class="com.mycompany.Assembly"/&gt;    
      &lt;/java-util-map&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					对于 NEsper .NET，请使用 <code class="literal">util-map</code> 代替 <code class="literal">java-util-map</code>。
				</p>
				<p>
					此配置将 <code class="literal">MyMapEvent</code> 事件的 <code class="literal">carId</code> 属性定义为 <code class="literal">int</code> 类型，将 <code class="literal">carType</code> 属性定义为 <code class="literal">java.util.String</code> 类型。Map 事件的 <code class="literal">assembly</code> 属性将包含 <code class="literal">com.mycompany.Assembly</code> 的实例，以供运行时查询。
				</p>
				<p>
					<code class="literal">class</code> 属性的有效类型列在 <a class="xref" href="configuration.html#configuration-type-names" title="17.8. 类型名称">第 17.8 节 “类型名称”</a> 中。此外，任何可以通过 <code class="literal">Class.forName</code> 解析的全限定 Java 类名都是允许的。
				</p>
				<p>
					你也可以使用配置 API 来配置 <code class="literal">Map</code> 事件类型，如下简短代码片段所示：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Map&lt;String, Object&gt; properties = new LinkedHashMap&lt;String, Object&gt;();
properties.put("carId", "int");
properties.put("carType", "string");
properties.put("assembly", Assembly.class.getName());

Configuration configuration = new Configuration();
configuration.getCommon().addEventType("MyMapEvent", properties);</pre>
				<p>
					一个 Map 事件类型也可以成为一个或多个超类型的子类型，这些超类型也必须是 Map 事件类型。<code class="literal">java-util-map</code> 元素提供了可选属性 <code class="literal">supertype-names</code>，该属性接受以逗号分隔的 Map 事件类型名称列表，这些类型是该类型的超类型：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="AccountUpdate"&gt;
      &lt;java-util-map supertype-names="BaseUpdate, AccountEvent"&gt;
      &lt;/java-util-map&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					一个 Map 事件类型可以声明开始和结束时间戳属性名称。下面显示的 XML 指示编译器 <code class="literal">startts</code> 属性携带事件开始时间戳，<code class="literal">endts</code> 属性携带事件结束时间戳：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="AccountUpdate"&gt;
      &lt;java-util-map start-timestamp-property-name="startts" end-timestamp-property-name="endts"&gt;
      &lt;/java-util-map&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					要在运行时添加类型，请使用 <code class="literal">create map schema</code>。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypeobjectarray"></a>17.4.5. 由 <code class="literal">Object[]</code>（对象数组）表示的事件</h3>
						</div>
					</div>
				</div>
				<p>
					运行时可以通过 <code class="literal">EPEventService</code> 接口上的 <code class="literal">sendEventObjectArray(Object[] array, String eventTypeName)</code> 方法处理对象数组（<code class="literal">Object[]</code>）事件。对象数组中的元素表示事件属性。有关如何在运行时使用 <code class="literal">Object[]</code> 事件的详细信息，请参阅 <a class="xref" href="appendix_eventrepoa.html" title="附录 F. 事件表示：对象数组（Object[]）事件">附录 F，《事件表示：对象数组（Object[]）事件》</a> 部分。
				</p>
				<p>
					下面的 XML 配置代码片段配置了一个名为 <code class="literal">MyObjectArrayEvent</code> 的事件类型。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyObjectArrayEvent"&gt;
      &lt;objectarray&gt;
        &lt;objectarray-property name="carId" class="int"/&gt;
        &lt;objectarray-property name="carType" class="string"/&gt;
        &lt;objectarray-property name="assembly" class="com.mycompany.Assembly"/&gt;    
      &lt;/objectarray&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					此配置将 <code class="literal">MyObjectArrayEvent</code> 事件的 <code class="literal">carId</code> 属性定义为 <code class="literal">int</code> 类型，且位于对象数组的第一个元素（<code class="literal">[0]</code>）。<code class="literal">carType</code> 属性定义为 <code class="literal">java.util.String</code> 类型，预期位于数组的第二个元素（<code class="literal">[1]</code>）。对象数组事件的 <code class="literal">assembly</code> 属性将包含 <code class="literal">com.mycompany.Assembly</code> 的实例，供运行时在第二个元素（<code class="literal">[2]</code>）中查询。
				</p>
				<p>
					请注意，当你的应用程序将对象数组事件发送到运行时，运行时不会验证对象数组事件的长度和属性值。对于上面的示例，合适的对象数组如下所示：<code class="literal">new Object[] {carId, carType, assembly}</code>。
				</p>
				<p>
					<code class="literal">class</code> 属性的有效类型列在 <a class="xref" href="configuration.html#configuration-type-names" title="17.8. 类型名称">第 17.8 节 “类型名称”</a> 中。此外，任何可以通过 <code class="literal">Class.forName</code> 解析的全限定 Java 类名都是允许的。
				</p>
				<p>
					你也可以使用配置 API 来配置 <code class="literal">Object[]</code> 事件类型，如下简短代码片段所示：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">String[] propertyNames = {"carId", "carType", "assembly"};
Object[] propertyTypes = {int.class, String.class, Assembly.class};

Configuration configuration = new Configuration();
configuration.getCommon().addEventType("MyObjectArrayEvent", propertyNames, propertyTypes);</pre>
				<p>
					一个对象数组事件类型也可以成为一个超类型的子类型，该超类型也必须是一个对象数组事件类型。<code class="literal">objectarray</code> 元素提供了可选属性 <code class="literal">supertype-names</code>，该属性接受一个对象数组事件类型的名称，该类型是此类型的超类型：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="AccountUpdate"&gt;
      &lt;objectarray supertype-names="BaseUpdate"&gt;
      &lt;/objectarray&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					一个对象数组事件类型可以声明开始和结束时间戳属性名称。下面显示的 XML 指示编译器 <code class="literal">startts</code> 属性携带事件开始时间戳，<code class="literal">endts</code> 属性携带事件结束时间戳：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="AccountUpdate"&gt;
      &lt;objectarray start-timestamp-property-name="startts" end-timestamp-property-name="endts"/&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					要在运行时添加类型，请使用 <code class="literal">create objectarray schema</code>。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypejson"></a>17.4.6. 由 JSON 表示的事件</h3>
						</div>
					</div>
				</div>
				<p>
					请使用 <code class="literal">create json schema</code> EPL 来定义一个 JSON 事件类型。没有用于预定义 JSON 事件类型的配置 API。
				</p>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypeavro"></a>17.4.7. 由 Avro <code class="literal">GenericData.Record</code> 表示的事件</h3>
						</div>
					</div>
				</div>
				<p>
					运行时可以通过 <code class="literal">EPEventService</code> 接口上的 <code class="literal">sendEventAvro(GenericData.Record event, String eventTypeName)</code> 方法处理 Avro <code class="literal">GenericData.Record</code> 事件。有关如何在编译器和运行时使用 Avro 事件的详细信息，请参阅 <a class="xref" href="appendix_eventrepavro.html" title="附录 H. 事件表示：Avro 事件（org.apache.avro.generic.GenericData.Record）">附录 H，《事件表示：Avro 事件（org.apache.avro.generic.GenericData.Record）》</a> 部分。
				</p>
				<p>
					下面的 XML 配置代码片段配置了一个名为 <code class="literal">MyAvroEvent</code> 的事件类型。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyAvroEvent"&gt;
      &lt;avro schema-text='{"type":"record","name":"MyAvroEvent","fields":[{"name":"carId","type":"int"},{"name":"carType","type":{"type":"string","avro.java.string":"String"}}]}'/&gt;
    &lt;/event-type&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>上面示例中的 Avro 模式的美化打印形式为：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{
  "type" : "record",
  "name" : "MyAvroEvent",
  "fields" : [ {
    "name" : "carId",
    "type" : "int"
  }, {
    "name" : "carType",
    "type" : {
      "type" : "string",
      "avro.java.string" : "String"
    }
  } ]
}</pre>
				<p>此模式定义了：</p>
				<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="orderedlist">
					<ol>
						<li>
							<p>
								一个类型为 <code class="literal">int</code> 的 <code class="literal">carId</code> 属性。
							</p>
						</li>
						<li>
							<p>
								一个类型为 <code class="literal">string</code> 的 <code class="literal">carType</code> 属性。注意：使用 Avro 提供的 <code class="literal">avro.java.string</code> 属性以确保它是一个 <code class="literal">java.lang.String</code> 实例，而不是 <code class="literal">java.lang.CharSequence</code> 实例。
							</p>
						</li>
					</ol>
				</div>
				<p>请注意，运行时不会验证 Avro 事件是否有效，或者它们是否与为 Avro 事件类型提供的模式实际匹配。</p>
				<p>你也可以使用配置 API 来配置 Avro 事件类型，如下简短代码片段所示：</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
ConfigurationCommonEventTypeAvro avroType = new ConfigurationCommonEventTypeAvro();
avroType.setAvroSchema(schema);
configuration.getCommon().addEventTypeAvro("MyAvroType", avroType);</pre>
				<p>
					要在运行时添加类型，请使用 <code class="literal">create avro schema</code>。
				</p>
				<p>
					一个 Avro 事件类型也可以成为一个超类型的子类型，该超类型也必须是一个 Avro 事件类型。<code class="literal">avro</code> 元素提供了可选属性 <code class="literal">supertype-names</code>，该属性接受一个 Avro 事件类型的名称，该类型是此类型的超类型：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyAvroEvent"&gt;
      &lt;avro supertype-names="BaseUpdate"/&gt;
    &lt;/event-type&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					一个 Avro 事件类型可以声明开始和结束时间戳属性名称。下面显示的 XML 指示编译器 <code class="literal">startts</code> 属性携带事件开始时间戳，<code class="literal">endts</code> 属性携带事件结束时间戳：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyAvroEvent"&gt;
      &lt;avro start-timestamp-property-name="startts" end-timestamp-property-name="endts"/&gt;
    &lt;/event-type&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
			</div>
			<div class="sect2" lang="en-US">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypexmldom"></a>17.4.8. 由 <code class="literal">org.w3c.dom.Node</code> 表示的事件</h3>
						</div>
					</div>
				</div>
				<p>
					通过此配置项，或使用 <code class="literal">create xml schema</code>，运行时可以原生处理 <code class="literal">org.w3c.dom.Node</code> 实例，即 XML 文档对象模型（DOM）节点。有关如何在编译器和运行时使用 <code class="literal">Node</code> 事件的详细信息，请参阅 <a class="xref" href="appendix_eventrepxml.html" title="附录 I. 事件表示：org.w3c.dom.Node XML 事件">附录 I，《事件表示：org.w3c.dom.Node XML 事件》</a> 部分。
				</p>
				<p>
					EPL 允许将 XPath 表达式配置为事件属性。你可以指定任意的 XPath 函数或表达式，并提供一个属性名称，其结果值将可用于表达式中。在 <code class="literal">create xml schema</code> 中使用 <code class="literal">@XMLSchemaField</code> 注解。
				</p>
				<p>对于遵循 XML 模式的 XML 文档，编译器和运行时可以加载和查询你的模式，并根据模式信息验证事件属性的名称和类型。</p>
				<p>
					在针对 <code class="literal">org.w3c.dom.Node</code> 事件的表达式中，也支持嵌套、映射和索引的事件属性。因此，使用现有的用于查询 JavaBean 对象、JavaBean 对象图或 <code class="literal">java.util.Map</code> 事件的事件属性语法，可以方便地查询 XML 树。
				</p>
				<p>
					最简单的形式是，编译器只需要一个包含根元素名称和事件类型名称的配置项，以便处理 <code class="literal">org.w3c.dom.Node</code> 事件：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="MyXMLNodeEvent"&gt;
      &lt;xml-dom root-element-name="myevent" /&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					你也可以使用配置 API 来配置 XML 事件类型，如下简短示例所示。实际上，通过 XML 配置可用的所有配置选项也可以通过 <code class="literal">ConfigurationEventTypeXMLDOM</code> 类上的 setter 方法来提供。
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setRootElementName("myevent");
desc.addXPathProperty("name1", "/element/@attribute", XPathConstants.STRING);
desc.addXPathProperty("name2", "/element/subelement", XPathConstants.NUMBER);
configuration.getCommon().addEventType("MyXMLNodeEvent", desc);</pre>
				<p>
					与上述配置等效的是通过 <code class="literal">create xml schema</code> 声明模式：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(rootElementName='myevent')
@XMLSchemaField(name='name1', xpath='/element/@attribute', type='string')
@XMLSchemaField(name='name2', xpath='/element/subelement', type='number')
create xml schema MyXMLNodeEvent()</pre>
				<p>下一个示例展示了一个示例配置项中的配置选项。</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type name="AutoIdRFIDEvent"&gt;
      &lt;xml-dom root-element-name="Sensor" schema-resource="data/AutoIdPmlCore.xsd" 
         default-namespace="urn:autoid:specification:interchange:PMLCore:xml:schema:1"&gt;
        &lt;namespace-prefix prefix="pmlcore" 
           namespace="urn:autoid:specification:interchange:PMLCore:xml:schema:1"/&gt;
        &lt;xpath-property property-name="countTags" 
           xpath="count(/pmlcore:Sensor/pmlcore:Observation/pmlcore:Tag)" type="number"/&gt;
      &lt;/xml-dom&gt;
    &lt;/event-type&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					与上述配置等效的是通过 <code class="literal">create xml schema</code> 声明模式：
				</p>
				<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(rootElementName='Sensor' schemaResource='data/AutoIdPmlCore.xsd', 
  defaultNamespace='urn:autoid:specification:interchange:PMLCore:xml:schema:1')
@XMLSchemaNamespacePrefix(prefix='pmlcore', namespace='urn:autoid:specification:interchange:PMLCore:xml:schema:1')" +
@XMLSchemaField(name='countTags', xpath='count(/pmlcore:Sensor/pmlcore:Observation/pmlcore:Tag)', type='number')
create xml schema AutoIdRFIDEvent()</pre>
				<p>
					此示例配置了一个名为 <code class="literal">countTags</code> 的事件属性，其值由一个 XPath 表达式计算得出。命名空间前缀和默认命名空间用于 XPath 表达式，并且必须让编译器和运行时也知道，以便编译器/运行时编译 XPath 表达式。通过 <code class="literal">schema-resource</code> 属性，你可以指示编译器/运行时加载一个模式文件。你也可以使用 <code class="literal">schema-text</code> 来提供模式的实际文本。
				</p>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-schema"></a>17.4.8.1. 模式资源</h4>
							</div>
						</div>
					</div>
					<p>
						<code class="literal">schema-resource</code> 属性或注解字段接受一个模式资源 URL 或类路径相对的文件名。编译器和运行时尝试将模式资源解析为一个 URL。如果模式资源名称不是一个有效的 URL，编译器和运行时将尝试通过 <code class="literal">ClassLoader.getResource</code> 方法，使用线程上下文类加载器从类路径解析该资源。如果名称无法解析，编译器和运行时将使用 Configuration 类的类加载器。当提供模式的实际文本更实际时，请使用 <code class="literal">schema-text</code> 属性。
					</p>
					<p>通过提供一个模式文件供编译器或运行时加载，编译器执行以下额外服务：</p>
					<div class="itemizedlist">
						<ul compact="compact">
							<li>
								<p>验证语句中的事件属性，确保事件属性名称与 XML 中的属性或元素匹配</p>
							</li>
							<li>
								<p>确定事件属性的类型，允许事件属性用于类型敏感的表达式中，例如涉及算术的表达式（注意：XPath 属性也有类型）</p>
							</li>
							<li>
								<p>将事件属性名称与元素名称或属性进行匹配</p>
							</li>
						</ul>
					</div>
					<p>
						如果未指定模式资源，则在编译时不会验证语句中指定的任何事件属性，并且它们的类型默认为 <code class="literal">java.lang.String</code>。此外，如果未指定模式资源，则不支持属性，因此必须通过 XPath 表达式声明。
					</p>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-xpathprop"></a>17.4.8.2. 显式 XPath 属性</h4>
							</div>
						</div>
					</div>
					<p>
						<code class="literal">xpath-property</code> 元素将通过 XPath 表达式计算得出的显式命名的事件属性添加到事件类型中。为了使 XPath 表达式能够编译，请务必指定 <code class="literal">default-namespace</code> 属性，并使用 <code class="literal">namespace-prefix</code> 声明命名空间前缀。
					</p>
					<p>
						XPath 表达式属性是强类型的。<code class="literal">type</code> 属性允许以下值。这些值与 <code class="literal">javax.xml.xpath.XPathConstants</code> 声明的值相对应。
					</p>
					<div class="itemizedlist">
						<ul compact="compact">
							<li>
								<p>
									number（注意：解析为 <code class="literal">double</code> 类型）
								</p>
							</li>
							<li>
								<p>string</p>
							</li>
							<li>
								<p>boolean</p>
							</li>
							<li>
								<p>node</p>
							</li>
							<li>
								<p>nodeset</p>
							</li>
						</ul>
					</div>
					<p>如果你需要 XPath 表达式返回上述类型以外的类型，可以指定一个可选的转换类型。如果指定了转换类型，操作首先会将 XPath 表达式的结果获取为定义的类型（number、string、boolean），然后将返回的类型转换或解析为指定的转换类型。在运行时，如果 XPath 表达式返回的结果对象无法进行转换或解析，将记录一条警告消息。</p>
					<p>下一行展示了如何为返回字符串的 XPath 表达式返回一个 long 类型的属性：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">desc.addXPathProperty("name", "/element/sub", XPathConstants.STRING, "long");</pre>
					<p>
						对于与 <code class="literal">create xml schema</code> 一起使用时，形式如下：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchemaField(name='name', xpath='/element/sub', type='string', castToType='long')</pre>
					<p>等效的配置 XML 如下：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">&lt;xpath-property property-name="name"  xpath="/element/sub" type="string" cast="long"/&gt;</pre>
					<p>
						有关转换类型名称的列表，请参阅 <a class="xref" href="configuration.html#configuration-type-names" title="17.8. 类型名称">第 17.8 节 “类型名称”</a>。
					</p>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-domabsolute"></a>17.4.8.3. 绝对或深度属性解析</h4>
							</div>
						</div>
					</div>
					<p>此设置指示在将属性编译为 XPath 表达式时，编译应生成绝对 XPath 表达式或深度（查找元素）XPath 表达式。</p>
					<p>例如，考虑针对由 XML DOM 文档表示的事件类型的以下语句，假设事件类型 GetQuote 已被编译器配置为 XML DOM 事件类型：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select request, request.symbol from GetQuote</pre>
					<p>默认情况下，编译器将 “request” 属性名称编译为 XPath 表达式 “/GetQuote/request”。它将名为 “request.symbol” 的嵌套属性编译为 XPath 表达式 “/GetQuote/request/symbol”，其中根元素节点是 “GetQuote”。</p>
					<p>通过将绝对属性解析设置为 false，编译器将 “request” 属性名称编译为 XPath 表达式 “//request”。它将名为 “request.symbol” 的嵌套属性编译为 XPath 表达式 “//request/symbol”。这使得这些元素可以在 XML 文档的任何位置找到。</p>
					<p>
						可以在 XML 中通过属性 <code class="literal">resolve-properties-absolute</code> 来设置此选项。
					</p>
					<p>配置 API 提供了上述设置，如以下示例代码所示：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">Configuration configuration = new Configuration();
ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setRootElementName("GetQuote");
desc.setDefaultNamespace("http://services.samples/xsd");
desc.setRootElementNamespace("http://services.samples/xsd");
desc.addNamespacePrefix("m0", "http://services.samples/xsd");
desc.setXPathResolvePropertiesAbsolute(false);
configuration.getCommon().addEventType("GetQuote", desc);</pre>
					<p>
						与上述配置等效的是通过 <code class="literal">create xml schema</code> 声明模式：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(rootElementName = 'GetQuote', defaultNamespace='http://services.samples/xsd',
  rootElementNamespace='http://services.samples/xsd', xpathResolvePropertiesAbsolute=false)
@XMLSchemaNamespacePrefix(prefix='m0', namespace='http://services.samples/xsd')
create xml schema GetQuote()</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-xpathresolver"></a>17.4.8.4. XPath 变量和函数解析器</h4>
							</div>
						</div>
					</div>
					<p>
						如果你的 XPath 表达式需要变量或函数，你的应用程序可以提供 <code class="literal">XPathVariableResolver</code> 和 <code class="literal">XPathFunctionResolver</code> 的类名。在类型初始化时，编译器和运行时会实例化解析器实例，并将它们提供给 XPathFactory。
					</p>
					<p>此示例展示了设置此配置的 API。</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setXPathFunctionResolver(MyXPathFunctionResolver.class.getName());
desc.setXPathVariableResolver(MyXPathVariableResolver.class.getName());</pre>
					<p>此示例展示了 EPL 注解的用法：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(xpathFunctionResolver='class name here', xpathVariableResolver='class name here')</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-autofragment"></a>17.4.8.5. 自动片段</h4>
							</div>
						</div>
					</div>
					<p>此选项在提供 XSD 模式时使用，用于确定当属性表达式转换根据模式属于复杂类型的属性时，编译器是否自动创建事件类型。</p>
					<p>示例：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setAutoFragment(false);</pre>
					<p>此示例展示了 EPL 注解的用法：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(autoFragment=false</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-xpathpropertyexpr"></a>17.4.8.6. XPath 属性表达式</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，编译器和运行时使用内置的 DOM 遍历器实现来计算 XPath 表达式，该实现不支持命名空间。</p>
					<p>当此配置设置为 true 时，它指示编译器将属性表达式重写为 XPath。</p>
					<p>示例：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setXPathPropertyExpr(true);</pre>
					<p>此示例展示了 EPL 注解的用法：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(xpathPpropertyExpr=true</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-eventsendervalidatesroot"></a>17.4.8.7. 事件发送器设置</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，给定 XML 事件类型的 <code class="literal">EventSender</code> 会根据发送到运行时的 <code class="literal">org.w3c.Node</code> 所提供的根元素名称，验证为该类型声明的根元素名称。
					</p>
					<p>
						当此配置设置为 false 时，它指示 <code class="literal">EventSender</code> 不进行验证。
					</p>
					<p>示例：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setEventSenderValidatesRoot(false);</pre>
					<p>此示例展示了 EPL 注解的用法：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@XMLSchema(eventSenderValidatesRoot=false</pre>
				</div>
				<div class="sect3" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventtypexmldom-startendtimestamp"></a>17.4.8.8. 开始和结束时间戳</h4>
							</div>
						</div>
					</div>
					<p>你可以配置提供事件开始时间戳和事件结束时间戳的属性名称，作为配置的一部分。</p>
					<p>
						一个将 <code class="literal">startts</code> 配置为提供开始时间戳的属性名称，将 <code class="literal">endts</code> 配置为提供结束时间戳的属性名称的示例：
					</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">ConfigurationCommonEventTypeXMLDOM desc = new ConfigurationCommonEventTypeXMLDOM();
desc.setStartTimestampPropertyName("startts");
desc.setEndTimestampPropertyName("endts");</pre>
					<p>
						当使用 <code class="literal">create xml schema</code> 时，开始和结束时间戳是 <code class="literal">create schema</code> 的一部分。
					</p>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventmeta"></a>17.4.9. 事件类型默认值</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventmeta-representation"></a>17.4.9.1. 默认事件表示形式</h4>
							</div>
						</div>
					</div>
					<p>默认的事件表示形式是 Map 事件表示形式。</p>
					<p>
						当您的查询将各个属性输出到监听器，并且在注解中未指定特定的事件表示形式时，默认的事件表示形式就会起作用。默认的事件表示形式对于 <code class="literal">create schema</code> 和 <code class="literal">create window</code> 语句也同样适用。
					</p>
					<p>请注意，即使默认的事件表示形式是对象数组，编译器在处理某些类型的语句时仍可能使用 Map 表示形式。</p>
					<p>例如，考虑以下语句：</p>
					<pre>select propertyOne, propertyTwo from MyEvent</pre>
					<p>目前，上述语句的监听器会接收到一个 Map 类型的事件。通过按照本文所述将配置标志设置为对象数组或 Avro，该语句的监听器将改为接收对象数组类型的事件或 Avro 类型的事件。</p>
					<p>以下 XML 片段展示了如何将默认事件表示形式设置为对象数组：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-meta&gt;
      &lt;event-representation type="objectarray"/&gt; &lt;!-- 使用 "json" 表示 JSON，使用 "avro" 表示 Avro --&gt;
    &lt;/event-meta&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>接下来展示的代码片段将配置对象中的默认事件表示形式设置为对象数组：</p>
					<pre>Configuration configuration = new Configuration();
configuration.getCommon().getEventMeta().
    setDefaultEventRepresentation(EventUnderlyingType.OBJECTARRAY);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventmeta-avro"></a>17.4.9.2. Avro 设置</h4>
							</div>
						</div>
					</div>
					<p>此配置用于控制与 Avro 相关的编译器设置。</p>
					<p>
						<code class="literal">enable-avro</code> 设置为布尔类型，默认值为 false。它控制是否启用或禁用 Avro。如果禁用，编译器和运行时将不允许注册 Avro 事件类型或使用 Avro 事件表示形式。
					</p>
					<p>
						<code class="literal">enable-native-string</code> 设置为布尔类型，默认值为 true。它控制在编译器生成 Avro 模式时，对于 String 类型的值，此类字段模式是否会添加属性 <code class="literal">avro.java.string</code>，其值为 <code class="literal">String</code>。
					</p>
					<p>
						<code class="literal">enable-schema-default-nonnull</code> 设置为布尔类型，默认值为 true。它控制编译器是组装非空的 Avro 模式（true）还是可空（联合）的 Avro 模式（false）。
					</p>
					<p>
						<code class="literal">objectvalue-typewidener-factory-class</code> 设置是实现 <code class="literal">com.espertech.esper.common.client.hook.type.ObjectValueTypeWidenerFactory</code> 接口的类的完全限定类名，默认值为 null。如果指定了该设置，工厂可以为将任何对象值扩展、强制转换或转换为 Avro 字段值提供类型扩展器。
					</p>
					<p>
						<code class="literal">type-representation-mapper-class</code> 设置是实现 <code class="literal">com.espertech.esper.common.client.hook.type.TypeRepresentationMapper</code> 接口的类的完全限定类名，默认值为 null。如果指定了该设置，实现可以为给定的类提供字段的 Avro 模式。
					</p>
					<p>以下 XML 片段展示了将 Avro 设置配置为与默认值相同的示例：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-meta&gt;
      &lt;avro-settings enable-avro="false" enable-native-string="true" enable-schema-default-nonnull="true"
          objectvalue-typewidener-factory-class=""
          type-representation-mapper-class=""/&gt;
    &lt;/event-meta&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>接下来展示的代码片段将配置对象中的默认事件表示形式设置为对象数组：</p>
					<pre>Configuration configuration = new Configuration();
configuration.getCommon().getEventMeta().getAvroSettings().setEnableAvro(false);
configuration.getCommon().getEventMeta().getAvroSettings().setEnableNativeString(true);
configuration.getCommon().getEventMeta().getAvroSettings().setEnableSchemaDefaultNonNull(true);
configuration.getCommon().getEventMeta().getAvroSettings().setObjectValueTypeWidenerFactoryClass(null);
configuration.getCommon().getEventMeta().getAvroSettings().setTypeRepresentationMapperClass(null);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventmeta-xmlxsd"></a>17.4.9.3. XML XSD 模式设置</h4>
							</div>
						</div>
					</div>
					<p>
						此配置用于控制与 XML XSD 模式相关的编译器和运行时设置。更多信息可参考 <a class="xref" href="appendix_eventrepxml.html#appendix_eventrepxml_schema-start" title="I.2.1. 入门">I.2.1 节，“入门”</a>。
					</p>
					<p>
						<code class="literal">enable-xmlxsd</code> 设置为布尔类型，默认值为 false。它控制是否启用或禁用使用 Apache Xerces 2 的 XML XSD 模式。如果禁用，编译器和运行时将不允许注册 XML XSD 模式事件类型。
					</p>
					<p>以下 XML 片段展示了将设置配置为与默认值相同的示例：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-meta enable-xmlxsd="false"/&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>接下来展示的代码片段将配置对象中的默认事件表示形式设置为对象数组：</p>
					<pre>Configuration configuration = new Configuration();
configuration.getCommon().getEventMeta().setEnableXMLXSD(true);</pre>
				</div>

				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-eventmeta-propertyreso"></a>17.4.9.4. Java 类属性名称、大小写敏感性和访问器样式</h4>
							</div>
						</div>
					</div>
					<p>
						这允许将所有事件类的大小写敏感性或访问器样式设置为默认值。这两个设置可以在 XML 通用配置中 <code class="literal">event-meta</code> 下的 <code class="literal">class-property-resolution</code> 中找到。
					</p>
					<p>
						要控制如 <a class="xref" href="configuration.html#configuration-common-eventtypebean-casesensitivity" title="17.4.3.4. 大小写敏感性和属性名称">17.4.3.4 节，“大小写敏感性和属性名称”</a> 中所讨论的大小写敏感性，可以在 XML 配置中添加 <code class="literal">style</code> 属性，以设置适用于所有事件类的默认大小写敏感性，除非被特定类的配置覆盖。默认的大小写敏感性是 <code class="literal">case_sensitive</code>（启用大小写敏感性）。
					</p>
					<p>
						要控制如 <a class="xref" href="configuration.html#configuration-common-eventtypebean-legacy" title="17.4.3.2. 非 JavaBean 和遗留 Java 事件类">17.4.3.2 节，“非 JavaBean 和遗留 Java 事件类”</a> 中所讨论的访问器样式，可以在 XML 配置中添加 <code class="literal">accessor-style</code> 属性，以设置适用于所有事件类的默认访问器样式，除非被特定类的配置覆盖。默认的访问器样式是 <code class="literal">javabean</code> JavaBean 访问器样式。
					</p>
					<p>接下来的代码片段展示了如何通过 API 控制此功能：</p>
					<pre>Configuration config = new Configuration();
config.getCommon().getEventMeta().setClassPropertyResolutionStyle(
    PropertyResolutionStyle.CASE_INSENSITIVE);
config.getCommon().getEventMeta().setDefaultAccessorStyle(
    AccessorStyle.PUBLIC);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-eventtypeautoname"></a>17.4.10. 事件类型导入包（事件类型自动命名）</h3>
						</div>
					</div>
				</div>
				<p>
					通过此配置，应用程序可以指定包含其 Java 事件类的 Java 包。这样，应用程序可以使用 <code class="literal"> create schema <em>name</em> as <em>simple-classname</em></code>，编译器就能找到相应的类。
				</p>
				<p>用于定义包含 Java 事件类的 Java 包的 XML 配置如下：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;event-type-auto-name package-name="com.mycompany.order.event"/&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					使用 <code class="literal">Configuration</code> 类实现相同的配置如下：
				</p>
				<pre>Configuration config = new Configuration();
config.getCommon().addEventTypeAutoName("com.mycompany.order.event");
// ... 或者 ...
config.getCommon().addEventTypeAutoName(MyEvent.getPackage().getName());</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-methodinvocations"></a>17.4.11. From 子句方法调用</h3>
						</div>
					</div>
				</div>
				<p>
					EPL 的 <code class="literal">from</code> 子句中允许进行方法调用，这样应用程序可以将事件流与 Web 服务返回的数据、从分布式缓存或面向对象数据库读取的数据进行连接，或者通过其他方式获取数据。通过本文描述的配置设置，可以在这些方法调用前设置本地缓存。
				</p>
				<p>
					LRU 缓存的详细描述请参考 <a class="xref" href="configuration.html#configuration-common-databaseref-cache-lru" title="17.4.12.6.1. LRU 缓存">17.4.12.6.1 节，“LRU 缓存”</a>。过期时间缓存的文档请参考 <a class="xref" href="configuration.html#configuration-common-databaseref-cache-expiry" title="17.4.12.6.2. 过期时间缓存">17.4.12.6.2 节，“过期时间缓存”</a>
				</p>
				<p>接下来的 XML 片段是一个示例缓存配置，适用于类 'MyFromClauseLookupLib' 和 'MyFromClauseWebServiceLib' 提供的方法。XML 和 API 配置既支持完全限定的 Java 类名，也支持简单类名：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;method-reference class-name="com.mycompany.MyFromClauseLookupLib"&gt;
      &lt;expiry-time-cache max-age-seconds="10" purge-interval-seconds="10" ref-type="weak"/&gt;
    &lt;/method-reference&gt; 	
    &lt;method-reference class-name="MyFromClauseWebServiceLib"&gt;
      &lt;lru-cache size="1000"/&gt;
    &lt;/method-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-databaseref"></a>17.4.12. 关系数据库访问</h3>
						</div>
					</div>
				</div>
				<p>
					对于 NEsper .NET，另请参考 <a class="xref" href="appendix_dotnet.html#appendix_dotnet_config_database_ref" title="J.17. .NET 配置 - 关系数据库访问">J.17 节，“.NET 配置 - 关系数据库访问”</a>。
				</p>
				<p>
					EPL 具备将事件流与历史数据源（如关系数据库）进行连接的能力。本节描述了编译器或运行时访问数据库中存储的数据所需的配置项。有关包含历史数据源的 EPL 查询的使用信息，请参考 <a class="xref" href="epl_clauses.html#histdata_overview" title="5.13. 通过 SQL 访问关系数据">5.13 节，“通过 SQL 访问关系数据”</a>。
				</p>
				<p>从关系数据库中轮询数据的 EPL 查询会在语句中指定数据库的名称。编译器和运行时使用此处描述的配置信息将语句中的数据库名称解析为数据库设置。以下总结了必需和可选的数据库设置。</p>
				<div class="itemizedlist">
					<ul compact="compact">
						<li>
							<p>
								可以通过 JDBC <code class="literal">javax.xml.DataSource</code>、<code class="literal">java.sql.DriverManager</code> 以及数据源工厂来获取数据库连接。这些获取数据库连接的方法之一是必需的配置。
							</p>
						</li>
						<li>
							<p>可选地，可以定义 JDBC 连接级别的设置，如自动提交、事务隔离级别、只读和目录名称。</p>
						</li>
						<li>
							<p>可选地，可以设置连接生命周期，以指示运行时是必须保留连接，还是必须为每次查找获取新连接，并在查找完成后关闭连接（池化）。</p>
						</li>
						<li>
							<p>可选地，定义缓存策略，允许运行时从查询缓存中检索数据，减少查询执行次数。</p>
						</li>
					</ul>
				</div>
				<p>某些设置可能会对性能产生重要影响，需要结合数据库软件、JDBC 驱动程序和运行时环境仔细考虑。本节将在适当的地方概述这些影响。</p>
				<p>
					“etc” 文件夹中的示例 XML 配置文件可作为配置数据库设置的模板。所有设置也可以通过 <code class="literal">Configuration</code> 和 <code class="literal">ConfigurationDBRef</code> 类通过配置 API 进行设置。
				</p>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-datasource"></a>17.4.12.1. 通过数据源获取连接</h4>
							</div>
						</div>
					</div>
					<p>
						此配置会使编译器或运行时从 JNDI 提供程序中可用的 <code class="literal">javax.sql.DataSource</code> 获取数据库连接。
					</p>
					<p>
						当在应用服务器中运行，或者 Java 虚拟机中以其他方式存在 JNDI 目录时，此设置最为有用。如果应用环境没有提供可用的 <code class="literal">DataSource</code>，下一节将概述如何使用 Apache DBCP 作为具有连接池选项的 <code class="literal">DataSource</code> 实现，以及如何使用自定义工厂来实现 <code class="literal">DataSource</code>。
					</p>
					<p>
						如果 <code class="literal">DataSource</code> 从连接池中提供连接，配置应将集合生命周期设置为 <code class="literal">pooled</code>。
					</p>
					<p>
						以下 XML 片段配置了一个名为 <code class="literal">mydb1</code> 的数据库，通过 <code class="literal">javax.sql.DataSource</code> 获取连接。<code class="literal">datasource-connection</code> 元素指示运行时通过 <code class="literal">javax.naming.InitialContext</code> 对给定的对象查找名称执行查找操作，来获取到数据库 <code class="literal">mydb1</code> 的新连接。示例中还展示了 <code class="literal">InitialContext</code> 的可选环境属性。
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb1"&gt;
      &lt;datasource-connection context-lookup-name="java:comp/env/jdbc/mydb"&gt;
        &lt;env-property name="java.naming.factory.initial" value ="com.myclass.CtxFactory"/&gt;
        &lt;env-property name="java.naming.provider.url" value ="iiop://localhost:1050"/&gt;
      &lt;/datasource-connection&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>为了帮助您更好地理解运行时如何使用这些信息来获取连接，请查看以下逻辑。</p>
					<pre>if (envProperties.size() &gt; 0) {
  initialContext = new InitialContext(envProperties);
}
else {
  initialContext = new InitialContext();
}
DataSource dataSource = (DataSource) initialContext.lookup(lookupName);
Connection connection = dataSource.getConnection();</pre>
					<p>
						为了插入您自己的 <code class="literal">DataSource</code> 接口实现，如果在 J2EE 环境中运行，应用程序可以使用应用服务器提供的现有 JNDI 提供程序。
					</p>
					<p>
						如果应用程序没有现有的 JNDI 实现来注册 <code class="literal">DataSource</code> 以提供连接，可以在配置中设置 <code class="literal">java.naming.factory.initial</code> 属性，指向应用程序自己实现的 <code class="literal">javax.naming.spi.InitialContextFactory</code> 接口，该接口可以通过工厂实现提供的 <code class="literal">javax.naming.Context</code> 返回应用程序的 <code class="literal">DataSource</code>。更多信息请参阅 Java 命名和目录接口 (JNDI) API 文档。
					</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-datasourcefactory"></a>17.4.12.2. 通过数据源工厂获取连接</h4>
							</div>
						</div>
					</div>
					<p>
						本节介绍如何使用 <em class="citetitle"><a class="link" href="http://commons.apache.org/dbcp" target="">Apache Commons 数据库连接池 (Apache DBCP)</a></em>。它解释了如果不使用 Apache DBCP，如何提供自定义的特定于应用程序的 <code class="literal">DataSource</code> 工厂。
					</p>
					<p>
						如果 <code class="literal">DataSource</code> 从连接池中提供连接，配置应将集合生命周期设置为 <code class="literal">pooled</code>。
					</p>
					<p>
						Apache DBCP 提供了全面的方法来测试无效连接，或者扩展和收缩连接池。Apache DBCP 的配置属性可以在 <em class="citetitle"><a class="link" href="http://commons.apache.org/dbcp/configuration.html" target="">Apache DBCP 配置</a></em> 中找到。列出的属性将通过作为配置一部分提供的属性列表传递给 Apache DBCP。
					</p>
					<p>
						以下 XML 片段是一个示例，配置了一个名为 <code class="literal">mydb3</code> 的数据库，通过 Apache DBCP <code class="literal">BasicDataSourceFactory</code> 提供的连接池 <code class="literal">DataSource</code> 获取连接。
					</p>
					<p>
						列出的属性将传递给 DBCP，以指示 DBCP 如何管理连接池。以下设置将连接池初始化为 2 个连接，并提供验证查询 <code class="literal">select 1 from dual</code>，以便 DBCP 在从连接池提供连接之前验证连接：
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb3"&gt;
      &lt;!-- 有关属性的完整列表，请参阅 Apache DBCP。 --&gt;
      &lt;!-- 注意：“dbcp2” 适用于 DBCP 的 api-2.0，否则使用 “dbcp”。 --&gt;
      &lt;datasourcefactory-connection class-name="org.apache.commons.dbcp2.BasicDataSourceFactory"&gt;	
        &lt;env-property name="username" value ="myusername"/&gt;
        &lt;env-property name="password" value ="mypassword"/&gt;
        &lt;env-property name="driverClassName" value ="com.mysql.jdbc.Driver"/&gt;
        &lt;env-property name="url" value ="jdbc:mysql://localhost/test"/&gt;
        &lt;env-property name="initialSize" value ="2"/&gt;
        &lt;env-property name="validationQuery" value ="select 1 from dual"/&gt;
      &lt;/datasourcefactory-connection&gt;
      &lt;connection-lifecycle value="pooled"/&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>通过 API 提供的相同配置选项：</p>
					<pre>Properties props = new Properties();
props.put("username", "myusername");
props.put("password", "mypassword");
props.put("driverClassName", "com.mysql.jdbc.Driver");
props.put("url", "jdbc:mysql://localhost/test");
props.put("initialSize", 2);
props.put("validationQuery", "select 1 from dual");

ConfigurationCommonDBRef configDB = new ConfigurationCommonDBRef();
// BasicDataSourceFactory 是一个 Apache DBCP 导入
configDB.setDataSourceFactory(props, BasicDataSourceFactory.class.getName());
configDB.setConnectionLifecycleEnum(ConfigurationCommonDBRef.ConnectionLifecycleEnum.POOLED);

Configuration configuration = new Configuration();;
configuration.getCommon().addDatabaseReference("mydb3", configDB);</pre>
					<p>Apache Commons DBCP 是一个单独的下载项，并非发行版的一部分。Apache Commons DBCP 的 jar 文件需要 Apache Commons Pool 的 jar 文件。</p>
					<p>
						应用程序可以为 <code class="literal">DataSource</code> 实例提供自己的工厂实现：将类名设置为应用程序类的名称，该类提供一个名为 <code class="literal">createDataSource</code> 的公共静态方法，该方法接受单个 <code class="literal">Properties</code> 对象作为参数并返回一个 <code class="literal">DataSource</code> 实现。例如：
					</p>
					<pre>configDB.setDataSourceFactory(props, MyOwnDataSourceFactory.class.getName());
...
class MyOwnDataSourceFactory {
  public static DataSource createDataSource(Properties properties) {
    return new MyDataSourceImpl(properties);
  }
}</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-drivermanager"></a>17.4.12.3. 通过 DriverManager 获取连接</h4>
							</div>
						</div>
					</div>
					<p>
						以下 XML 片段配置了一个名为 <code class="literal">mydb2</code> 的数据库，通过 <code class="literal">java.sql.DriverManager</code> 获取连接。<code class="literal">drivermanager-connection</code> 元素指示运行时通过 <code class="literal">Class.forName</code> 和 <code class="literal">DriverManager.getConnection</code>，使用类名、URL 以及可选的用户名、密码和连接参数，来获取到数据库 <code class="literal">mydb2</code> 的新连接。
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb2"&gt;
      &lt;drivermanager-connection class-name="my.sql.Driver" 
            url="jdbc:mysql://localhost/test?user=root&amp;password=mypassword" 
            user="myuser" password="mypassword"&gt;
        &lt;connection-arg name="user" value ="myuser"/&gt;
        &lt;connection-arg name="password" value ="mypassword"/&gt;
        &lt;connection-arg name="somearg" value ="someargvalue"/&gt;
      &lt;/drivermanager-connection&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>XML 中多处显示用户名和密码仅作为示例。请根据您的数据库软件检查 URL 和连接参数中所需的信息。</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-connections"></a>17.4.12.4. 连接级别设置</h4>
							</div>
						</div>
					</div>
					<p>可以向运行时选择性地提供额外的连接级别设置，运行时会将这些设置应用于新连接。当运行时获取新连接时，它只会将那些明确配置的设置应用于该连接，其他所有连接设置都保持默认值。</p>
					<p>
						以下 XML 是所有可用配置设置的示例。有关每个选项的更多信息，请参考 <code class="literal">java.sql.Connection</code> 的 Java API 文档，或者查阅您的 JDBC 驱动程序和数据库软件的文档。
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb2"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
      &lt;connection-settings auto-commit="true" catalog="mycatalog" 
          read-only="true" transaction-isolation="1" /&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>
						<code class="literal">read-only</code> 设置可用于向数据库运行时指示 SQL 语句是只读的。<code class="literal">transaction-isolation</code> 和 <code class="literal">auto-commit</code> 有助于数据库软件执行适当级别的锁定和解锁操作。考虑设置这些值以减少数据库查询中的事务开销。
					</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-connectionslifecycle"></a>17.4.12.5. 连接生命周期设置</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，运行时会为每个已启动的语句保留一个单独的数据库连接。但是，可以覆盖此行为，要求运行时为每次查找获取一个新的数据库连接，并在查找完成后关闭该数据库连接。当您有大量语句并且需要通过连接池进行连接池化时，这种做法通常是有意义的。</p>
					<p>
						在 <code class="literal">pooled</code> 设置中，运行时会为每个查询从数据源或驱动管理器获取一个数据库连接，并在完成后关闭连接，如果使用的是连接池数据源，则将数据库连接返回给连接池。
					</p>
					<p>
						在 <code class="literal">retain</code> 设置中，运行时会为每个语句保留一个单独的专用数据库连接，并且在使用之间不关闭连接。
					</p>
					<p>
						此选项的 XML 如下所示。连接生命周期允许以下值：<code class="literal">pooled</code> 和 <code class="literal">retain</code>。
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb2"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
        &lt;connection-lifecycle value="pooled"/&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-cache"></a>17.4.12.6. 缓存设置</h4>
							</div>
						</div>
					</div>
					<p>缓存设置可以显著减少运行时为语句执行的数据库查询数量。如果未指定缓存设置，运行时将不会缓存查询结果，并且会为每个事件执行一个单独的数据库查询。</p>
					<p>缓存存储数据库查询的结果，并使用与存储结果的查询完全相同的查询参数，将这些结果提供给后续查询。如果您的查询返回一行或多行，缓存会将查询的结果行按查询参数进行键控存储。如果您的查询不返回任何行，缓存也会保留空结果。查询结果会一直保留在缓存中，直到缓存条目被逐出。接下来列出了可用于逐出缓存查询结果的策略。</p>
					<div class="sect4" lang="zh-CN">
						<div class="titlepage">
							<div>
								<div>
									<h5 class="title"><a id="configuration-common-databaseref-cache-lru"></a>17.4.12.6.1. 最近最少使用（LRU）缓存</h5>
								</div>
							</div>
						</div>
						<p>最近最少使用（LRU）缓存通过最大大小进行配置。一旦缓存达到最大大小，缓存会首先丢弃最近最少使用的查询结果。</p>
						<p>LRU 缓存的 XML 配置条目如下所示。此条目配置了一个最多可容纳 1000 个查询结果的 LRU 缓存。</p>
						<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
      &lt;lru-cache size="1000"/&gt;
    &lt;/database-reference&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					</div>
					<div class="sect4" lang="zh-CN">
						<div class="titlepage">
							<div>
								<div>
									<h5 class="title"><a id="configuration-common-databaseref-cache-expiry"></a>17.4.12.6.2. 过期时间缓存</h5>
								</div>
							</div>
						</div>
						<p>过期时间缓存通过以秒为单位的最大有效期、清除间隔和可选的引用类型进行配置。缓存会在获取操作时丢弃任何超过最大有效期的查询结果，以避免使用陈旧数据。如果缓存不为空，那么运行时每隔清除间隔的秒数就会从缓存中清除任何过期的条目。</p>
						<p>过期时间缓存的 XML 配置条目如下。该示例配置了一个过期时间缓存，其中先前的查询结果在 60 秒内有效，并且运行时每隔 2 分钟检查一次，以删除超过 60 秒的查询结果。</p>
						<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
        &lt;expiry-time-cache max-age-seconds="60" purge-interval-seconds="120" /&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
						<p>
							默认情况下，过期时间缓存由 <code class="literal">java.util.WeakHashMap</code> 支持，因此依赖于弱引用。这意味着缓存的 SQL 结果可以在垃圾回收期间被释放。
						</p>
						<p>
							通过 XML 或使用配置 API，可以将引用类型配置为不允许条目被垃圾回收，方法是将 <code class="literal">ref-type</code> 属性设置为 <code class="literal">hard</code>：
						</p>
						<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
        &lt;expiry-time-cache max-age-seconds="60" purge-interval-seconds="120" ref-type="hard"/&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
						<p>
							缓存引用类型的最后一个设置是 <code class="literal">soft</code>：此策略仅在所有其他弱引用都已被回收时，才允许对缓存条目进行垃圾回收。
						</p>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-columnchangecase"></a>17.4.12.7. 列名大小写转换</h4>
							</div>
						</div>
					</div>
					<p>此设置指示编译器将数据库系统返回的任何输出列名转换为小写或大写。例如，当使用 Oracle 关系数据库软件时，可以通过此设置将列名转换为小写。</p>
					<p>此设置的示例 XML 配置条目为：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
      &lt;column-change-case value="lowercase"/&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-sqltypes"></a>17.4.12.8. SQL 类型映射</h4>
							</div>
						</div>
					</div>
					<p>对于 NEsper .NET，本节内容不适用。</p>
					<p>
						通过提供 SQL 类型（<code class="literal">java.sql.Types</code>）到 Java 内置类型的映射，您的代码可以避免使用有时不太方便的默认数据库类型，并且可以轻松更改编译器为 SQL 查询返回的列所返回的 Java 类型的方式。
					</p>
					<p>
						该映射将 <code class="literal">java.sql.Types</code> 定义的常量映射到以下任意 Java 类型名称的 Java 内置类型：<code class="literal">String, BigDecimal, Boolean, Byte, Short, Int, Long, Float, Double, ByteArray, SqlDate, SqlTime, SqlTimestamp</code>。Java 类型名称不区分大小写。
					</p>
					<p>
						接下来展示此设置的示例 XML 配置条目。该示例将 <code class="literal">Types.NUMERIC</code>（根据 JDBC API，其常量值为 <code class="literal">2</code>）映射到 Java <code class="literal">int</code> 类型。
					</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;database-reference name="mydb"&gt;
    &lt;!-- ... 配置数据源或驱动管理器设置... --&gt;
      &lt;sql-types-mapping sql-type="2" java-type="int" /&gt;
    &lt;/database-reference&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-databaseref-metadata"></a>17.4.12.9. 元数据来源</h4>
							</div>
						</div>
					</div>
					<p>此设置控制编译器如何从 JDBC 预编译语句中检索 SQL 语句元数据。</p>
					<div class="table">
						<a id="epl-grouping-aggregate-func"></a>
						<p class="title">
							<b>表 17.3. 聚合函数的语法和结果</b>
						</p>
						<div class="table-contents">
							<table summary="聚合函数的语法和结果" border="1">
								<colgroup>
									<col>
									<col>
								</colgroup>
								<thead>
									<tr>
										<th>选项</th>
										<th>描述</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td>default</td>
										<td>
											<p>默认情况下，如果驱动程序不是 Oracle 数据库驱动程序，编译器会检测驱动程序名称并查询预编译语句元数据。对于 Oracle 驱动程序，编译器会对 SQL 语句进行词法分析，以构造一个示例 SQL 语句，然后执行该语句以检索语句元数据。</p>
										</td>
									</tr>
									<tr>
										<td>metadata</td>
										<td>
											<p>无论使用何种数据库驱动程序，编译器始终查询预编译语句元数据。</p>
										</td>
									</tr>
									<tr>
										<td>sample</td>
										<td>
											<p>编译器始终使用对 SQL 语句的词法分析来构造一个示例 SQL 语句，然后执行该语句以检索语句元数据。</p>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-logging"></a>17.4.13. 与日志记录相关的通用设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-logging-queryplan"></a>17.4.13.1. 查询计划日志记录</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，除非设置为调试级别日志记录，否则编译器不会生成查询计划输出。要启用查询计划日志记录，请在配置中设置此选项。启用后，编译器将在日志名称 <code class="literal">com.espertech.esper.queryplan</code> 下以 INFO 级别报告任何查询计划。
					</p>
					<p>查询计划日志记录适用于子查询、连接（任何类型）、命名窗口和表的操作（on-select、on-merge、on-insert、on-update、on-select）以及即发即弃查询。对于其他类型的结构，它不适用且不会提供额外信息。</p>
					<p>用于启用查询计划日志记录的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getCommon().getLogging().setEnableQueryPlan(true);</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;logging&gt;
      &lt;query-plan enabled="true"/&gt;
    &lt;/logging&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-logging-jdbc"></a>17.4.13.2. JDBC 日志记录</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，编译器和运行时不会测量 JDBC 查询执行时间，也不会通过日志记录报告从 JDBC 查询返回的行数。要启用 JDBC 日志记录，请在配置中设置此选项。启用后，编译器和运行时将在日志名称 <code class="literal">com.espertech.esper.jdbc</code> 下以 INFO 级别报告任何 JDBC 查询性能和返回的行数。
					</p>
					<p>用于启用 JDBC 查询日志记录的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getCommon().getLogging().setEnableJDBC(true);</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
     &lt;logging&gt;
       &lt;jdbc enabled="true"/&gt;
    &lt;/logging&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-timesource"></a>17.4.14. 与时间源相关的通用设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-common-timesource-timeunit"></a>17.4.14.1. 时间单位</h4>
							</div>
						</div>
					</div>
					<p>默认的时间分辨率时间单位是毫秒。您的应用程序可以将时间分辨率设置为微秒。</p>
					<p>毫秒时间分辨率的示例 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;time-source&gt;
      &lt;time-unit value="milliseconds"/&gt;
    &lt;/time-source&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
					<p>使用配置 API 的等效代码片段如下：</p>
					<pre>Configuration config = new Configuration();
config.getCommon().getTimeSource().setTimeUnit(TimeUnit.MILLISECONDS);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-variables"></a>17.4.15. 变量</h3>
						</div>
					</div>
				</div>
				<p>
					变量可以在 EPL 中通过 <code class="literal">create variable</code> 语法动态创建，但也可以进行配置。
				</p>
				<p>声明一个变量时，需要指定变量名、变量类型、可选的初始化值以及一个可选的布尔类型标志，该标志指示变量是否为常量（默认值为 false）。初始化值可以与变量类型相同或兼容，也可以是一个字符串值，当解析时，该字符串值与为变量声明的类型兼容。将每个变量声明为常量以获得最佳性能。</p>
				<p>在 XML 配置文件中，变量配置可能如下所示。</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;variable name="var_threshold" type="long" initialization-value="100"/&gt;
    &lt;variable name="var_key" type="string"/&gt;
    &lt;variable name="test" type="int" constant="true"/&gt;  
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					有关 <code class="literal">type</code> 属性的有效值列表，请参阅 <a class="xref" href="configuration.html#configuration-type-names" title="17.8. 类型名称">17.8 节，“类型名称”</a>。
				</p>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-common-variantstream"></a>17.4.16. 变体流</h3>
						</div>
					</div>
				</div>
				<p>
					<span class="emphasis"><em>变体流</em></span>是一种预定义的流，多种不同事件类型的事件可以插入其中，并且可以在模式和 <code class="literal">from</code> 子句中对其进行选择操作。
				</p>
				<p>
					变体流的名称以及可选的该流可能接受的事件类型，是流定义的一部分。默认情况下，变体流仅接受预定义的事件类型。编译器会根据预定义的类型验证插入到变体流中的 <code class="literal">insert into</code> 子句。
				</p>
				<p>
					可以将变体流设置为接受任何类型的事件，在这种情况下，变体流的所有属性实际上都是动态属性。将 <code class="literal">type variance</code> 标志设置为 <code class="literal">ANY</code> 以表明变体流接受任何类型的事件。
				</p>
				<p>
					以下 XML 配置定义了一个名为 <code class="literal">OrderStream</code> 的变体流，该流仅承载 <code class="literal">PartsOrder</code> 和 <code class="literal">ServiceOrder</code> 事件：
				</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;common&gt;
    &lt;variant-stream name="OrderStream"&gt;
      &lt;variant-event-type name="PartsOrder"/&gt;
      &lt;variant-event-type name="ServiceOrder"/&gt;
    &lt;/variant-stream&gt;
  &lt;/common&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					此代码片段设置了一个名为 <code class="literal">OutgoingEvent</code> 的变体流：
				</p>
				<pre>Configuration config = new Configuration();
ConfigurationCommonVariantStream variant = new ConfigurationCommonVariantStream();
variant.setTypeVariance(ConfigurationCommonVariantStream.TypeVariance.ANY);
config.getCommon().addVariantStream("OutgoingEvent", variant);</pre>
				<p>如果指定变体事件类型名称，请确保这些名称已针对 JavaBean、Map 或 XML 事件进行了配置。</p>
			</div>
		</div>
		<div class="sect1" lang="zh-CN">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-compiler"></a>17.5. 编译器配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e48212" class="indexterm"></a>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-bytecode"></a>17.5.1. 与字节码生成相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-bytecode-general"></a>17.5.1.1. 字节码通用设置</h4>
							</div>
						</div>
					</div>
					<p>
						<code class="literal">include-debugsymbols</code> 设置默认值为 false。它控制编译器是否在二进制类中生成调试符号。
					</p>
					<p>
						<code class="literal">include-comments</code> 设置默认值为 false。它控制编译器是否生成包含额外信息的代码，以帮助将生成的代码追溯到生成它的原始代码。
					</p>
					<p>
						<code class="literal">attach-epl</code> 设置默认值为 true。它控制编译器是否将语句的文本添加到语句属性中。
					</p>
					<p>
						<code class="literal">attach-module-epl</code> 设置默认值为 false。它控制编译器是否将模块的 EPL 文本添加到模块属性中。
					</p>
					<p>
						<code class="literal">allow-subscriber</code> 设置默认值为 false。它控制编译器是否添加处理订阅者的代码。如果此标志为 false，<code class="literal">EPStatement</code> 类的 <code class="literal">setSubscriber</code> 方法将抛出异常。
					</p>
					<p>
						<code class="literal">allow-inlined-class</code> 设置默认值为 true。它控制编译器是否允许内联类。如果此标志为 false，编译器在遇到内联类时将抛出异常。
					</p>
					<p>
						<code class="literal">threadpool-compiler-num-threads</code> 设置用于将语句编译为字节码的线程数，默认值为 8。将此值设置为 0 会禁用编译的多线程功能。当线程数大于 0 时，调用线程为语句生成类，线程池将语句类编译为字节码。只有当模块有多个语句时，此设置才能提高编译性能，因为并行化的单位是语句。<code class="literal">threadpool-compiler-capacity</code> 设置定义了将语句编译为字节码的许可数量（队列容量），默认无限制。使用 <code class="literal">null</code> 表示无限制。容量的最小值为 1。
					</p>
					<p>
						<code class="literal">max-methods-per-class</code> 设置类或内部类中的最大方法数。此值默认设置为 1024（1k）。设置该值是因为 JVM 对每个类的常量池限制为 64k。JVM 类常量池除其他内容外还包含方法信息。因此，对于大型 EPL 表达式，编译器会尝试不超过此 JVM 限制。当发现一个类超过配置的最大方法数时，编译器会将方法移到一个或多个额外的类中。此设置的最小值为 100。如果此值设置得太大，您可能会看到诸如 <code class="literal">Constant pool for class has grown past JVM limit of 0xFFFF</code> 之类的编译消息。请注意，出现此消息可能还有其他原因。请参阅 <a class="xref" href="apicompiler.html#apicompiler-limitations" title="15.19. 限制">15.19 节，“限制”</a>。
					</p>
					<p>以下示例代码设置的值与默认值相同：</p>
					<pre>Configuration configuration = new Configuration();
ConfigurationCompilerByteCode byteCode = configuration.getCompiler().getByteCode();
byteCode.setIncludeDebugSymbols(false);
byteCode.setIncludeComments(false);
byteCode.setAttachEPL(true);
byteCode.setAttachModuleEPL(false);
byteCode.setAllowSubscriber(false);
byteCode.setAllowInlinedClass(false);
byteCode.setInstrumented(false);
byteCode.setThreadPoolCompilerNumThreads(8);
byteCode.setThreadPoolCompilerCapacity(null);
byteCode.setMaxMethodsPerClass(16*1024);</pre>
					<p>以下示例 XML 配置也设置了默认值：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;bytecode 
      include-comments="false" 
      include-debugsymbols="false"
      attach-epl="true" 
      attach-module-epl="false" 
      instrumented="false" 
      allow-subscriber="false"
      allow-inlined-class="true"
      threadpool-compiler-num-threads="8"
      max-methods-per-class="16384"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-bytecode-modifiers"></a>17.5.1.2. 字节码访问修饰符设置</h4>
							</div>
						</div>
					</div>
					<p>
						访问修饰符默认值为 <code class="literal">private</code>，如下所示。您也可以使用 <code class="literal">@private</code>、<code class="literal">@protected</code> 和 <code class="literal">@public</code> 注解或 <code class="literal">CompilerOptions</code> 对象来设置访问修饰符。
					</p>
					<div class="table">
						<a id="d0e48308"></a>
						<p class="title">
							<b>表 17.4. 字节码访问修饰符</b>
						</p>
						<div class="table-contents">
							<table summary="字节码访问修饰符" border="1">
								<colgroup>
									<col>
									<col>
								</colgroup>
								<thead>
									<tr>
										<th>名称</th>
										<th>描述</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><code class="literal">access-modifier-context</code></td>
										<td>模块中声明的上下文是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-eventtype</code></td>
										<td>模块中声明的事件类型是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-expression</code></td>
										<td>模块中声明的表达式是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-inlined-class</code></td>
										<td>模块中声明的内联类是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-namedwindow</code></td>
										<td>模块中声明的命名窗口是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-script</code></td>
										<td>模块中声明的脚本是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-table</code></td>
										<td>模块中声明的表是否对其他模块可见。</td>
									</tr>
									<tr>
										<td><code class="literal">access-modifier-variables</code></td>
										<td>模块中声明的变量是否对其他模块可见。</td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
					<p>
						<code class="literal">bus-modifier-event-type</code> 设置默认值为 <code class="literal">nonbus</code>。这意味着 <code class="literal">EPEventService</code> 的任何 <code class="literal">sendEvent<em>Type</em></code> 方法都不能用于处理该事件类型的事件。将此值设置为 <code class="literal">bus</code> 表示 <code class="literal">EPEventService</code> 的相应 <code class="literal">sendEvent<em>Type</em></code> 方法可以处理模块中声明的事件类型的事件（如果 <code class="literal">sendEvent<em>Type</em></code> 找不到可见的事件类型，它将抛出异常）。您也可以使用 <code class="literal">@buseventtype</code> 注解或 <code class="literal">CompilerOptions</code> 对象来设置总线事件类型的可见性。
					</p>
					<p>以下示例代码设置的值与默认值相同：</p>
					<pre>Configuration configuration = new Configuration();
ConfigurationCompilerByteCode byteCode = configuration.getCompiler().getByteCode();
byteCode.setAccessModifierContext(NameAccessModifier.PRIVATE);
byteCode.setAccessModifierEventType(NameAccessModifier.PRIVATE);
byteCode.setAccessModifierNamedWindow(NameAccessModifier.PRIVATE);
byteCode.setAccessModifierScript(NameAccessModifier.PRIVATE);
byteCode.setAccessModifierTable(NameAccessModifier.PRIVATE);
byteCode.setAccessModifierVariable(NameAccessModifier.PRIVATE);
byteCode.setBusModifierEventType(EventTypeBusModifier.NONBUS);</pre>
					<p>以下示例 XML 配置也设置了默认值：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;bytecode 
      access-modifier-context="private" 
      access-modifier-event-type="private" 
      access-modifier-expression="private" 
      access-modifier-named-window="private" 
      access-modifier-script="private" 
      access-modifier-table="private" 
      access-modifier-variable="private" 
      bus-modifier-event-type="nonbus"
      /&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-viewresources"></a>17.5.2. 与视图资源相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-viewresources-iterableunbound"></a>17.5.2.1. 无界流的迭代器行为</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，当使用迭代器 API 对具有无界流的语句进行迭代时，运行时会返回一个空的迭代器。</p>
					<p>
						若要让运行时返回最后一个事件，请使用 <code class="literal">@IterableUnbound</code> 语句注解，或者按照此处所述启用编译器设置。
					</p>
					<p>启用可迭代无界流的代码示例如下：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getViewResources().setIterableUnbound(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-viewresources-outputrateopt"></a>17.5.2.2. 配置输出速率限制选项</h4>
							</div>
						</div>
					</div>
					<p>
						此标志会影响输出速率限制，详情见 <a class="xref" href="appendix_outputlimit.html" title="Appendix B. Runtime Considerations for Output Rate Limiting">附录 B，《输出速率限制的运行时注意事项》</a>。该标志用于控制所有未指定提示的语句的输出速率限制默认行为。
					</p>
					<p>
						如果设置为 true（默认值），所有语句的行为就好像它们使用了提示 <code class="literal">@Hint('enable_outputlimit_opt')</code> 一样。
					</p>
					<p>
						如果设置为 false，所有语句的行为就好像它们使用了提示 <code class="literal">@Hint('disable_outputlimit_opt')</code> 一样。
					</p>
					<p>例如：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getViewResources().setOutputLimitOpt(true);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-logging"></a>17.5.3. 与日志记录相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-logging-code"></a>17.5.3.1. 字节码生成日志记录</h4>
							</div>
						</div>
					</div>
					<p>启用此设置后，编译器会以 INFO 级别记录字节码生成信息。此设置默认是禁用的。</p>
					<p>用于启用生成代码日志记录的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getLogging().setEnableCode(true);</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
      &lt;logging&gt;
        &lt;code enabled="true"/&gt;
      &lt;/logging&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-logging-filterplan"></a>17.5.3.2. 过滤计划日志记录</h4>
							</div>
						</div>
					</div>
					<p>
						编译器会分析过滤表达式并规划过滤索引。此设置指示编译器记录过滤计划。该标志默认值为 false，如果设置为 true，编译器会以 <code class="literal">INFO</code> 级别输出过滤计划日志。
					</p>
					<p>启用过滤计划日志记录的 API 代码片段如下：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getLogging().setEnableFilterPlan(true);</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
      &lt;logging&gt;
        &lt;filter-plan enabled="true"/&gt;
      &lt;/logging&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-streamselection"></a>17.5.4. 与流选择相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-streamselection-choices"></a>17.5.4.1. 默认语句流选择</h4>
							</div>
						</div>
					</div>
					<p>语句可以同时产生插入流（新数据）和删除流（旧数据）结果。请记住，插入流是指到达的事件和新的聚合值，而删除流是指离开数据窗口的事件和先前的聚合值。默认情况下，运行时仅将插入流传递给语句的监听器和观察者。</p>
					<p>
						如果应用程序不需要插入流和/或删除流结果，在 <code class="literal">select</code> 子句中有一些关键字可以指示运行时不生成这些结果。这些关键字是 <code class="literal">istream</code>、<code class="literal">rstream</code> 和 <code class="literal">irstream</code> 关键字。
					</p>
					<p>
						默认情况下，运行时仅生成与在 <code class="literal">select</code> 子句中使用可选的 <code class="literal">istream</code> 关键字等效的插入流结果。如果应用程序对许多语句都需要插入流和删除流结果，那么可以在每个语句的 <code class="literal">select</code> 子句中添加 <code class="literal">irstream</code> 关键字，或者可以通过此设置设置一个新的默认流选择器。
					</p>
					<p>此设置的 XML 配置如下所示：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;stream-selection&gt;
      &lt;stream-selector value="irstream" /&gt;
    &lt;/stream-selection&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>使用配置 API 的等效代码片段如下：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getStreamSelection()
    .setDefaultStreamSelector(StreamSelector.RSTREAM_ISTREAM_BOTH);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-language"></a>17.5.5. 与语言和区域设置相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<p>
					编译器中的区域设置相关性可能体现在 <code class="literal">order by</code> 子句和排序窗口对字符串值的排序顺序上。
				</p>
				<p>
					默认情况下，运行时使用与区域设置无关的 <code class="literal">compare</code> 方法对字符串值进行排序。要启用与区域设置相关的排序，必须按照以下说明设置配置标志。
				</p>
				<p>XML 配置设置与区域设置相关的排序如下所示：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;language sort-using-collator="true"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				<p>用于更改此设置的 API：</p>
				<pre>Configuration config = new Configuration();
config.getCompiler().getLanguage().setSortUsingCollator(true);</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-expression"></a>17.5.6. 与表达式求值相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-expression-division"></a>17.5.6.1. 整数除法和除以零</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，无论操作数类型如何，编译器对于除法运算都会返回双精度类型的值。除以零会返回正或负的双精度无穷大。</p>
					<p>
						若要让编译器使用 Java 标准的整数除法，请按此处说明使用此设置。在 Java 整数除法中，当对整数类型进行除法运算时，结果是整数类型。这意味着如果将一个整数不均匀地除以另一个整数，它会返回结果的整数部分，不进行任何舍入，小数部分将被舍弃。如果启用了 Java 标准整数除法，当用整数分子除以整数分母时，结果是一个整数。因此，表达式 <code class="literal">1 / 4</code> 的结果是整数零。那么在进行除法运算之前，您的 EPL 必须至少将其中一个数转换为双精度值，例如通过指定 <code class="literal">1.0 / 4</code> 或使用 <code class="literal">cast(myint, double)</code> 。
					</p>
					<p>使用 Java 整数除法时，对于整数类型操作数的除以零运算始终返回 null。但是对于双精度类型操作数的除以零运算仍然返回正或负的双精度无穷大。若要使双精度类型操作数在除以零的情况下也返回 null，请将标志设置为 true（默认值为 false），如下所示。</p>
					<p>XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;expression integer-division="false" division-by-zero-is-null="false"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getExpression().setIntegerDivision(true);
config.getCompiler().getExpression().setDivisionByZeroReturnsNull(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-expression-udfcache"></a>17.5.6.2. 用户定义函数或静态方法缓存</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，如果传递给用户定义函数的参数集为空或所有参数都是常量值，运行时会缓存该函数的结果。根据默认配置，自定义插件单行函数的结果不会被缓存，除非显式配置了启用值缓存的单行函数。</p>
					<p>若要让运行时无论参数是否为常量都对用户定义函数进行求值，请将标志设置为 false，如下所示。</p>
					<p>以下 XML 配置设置的是默认值：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;expression udf-cache="true"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-expression-extendedagg"></a>17.5.6.3. 扩展的内置聚合函数</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，EPL 提供了一些超出 SQL 标准的额外聚合函数。若要让编译器只允许使用标准 SQL 聚合函数而不允许使用额外的函数，请按此处说明禁用该设置。</p>
					<p>以下 XML 配置设置的是默认值：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;expression extended-agg="true"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-expression-ducktype"></a>17.5.6.4. 鸭子类型</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，编译器在编译时使用点运算符语法时会验证方法引用。使用鸭子类型时，编译器会在运行时解析方法引用。</p>
					<p>以下 XML 配置设置的是默认值：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;expression ducktyping="false"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-expression-mathcontext"></a>17.5.6.5. 数学上下文</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，在计算 BigDecimal 值的平均值时，编译器不会传递 <code class="literal">java.math.MathContext</code> 。请使用此处的设置指定默认的数学上下文。
					</p>
					<p>以下 XML 配置将精度设置为 2 并将舍入模式设置为天花板模式：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;expression math-context="precision=2 roundingMode=CEILING"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>接下来是一个 API 配置示例：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getExpression().setMathContext(MathContext.UNLIMITED);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-scripts"></a>17.5.7. 与脚本相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<p>
					您可以按此处说明配置默认的脚本方言。默认的脚本方言是 <code class="literal">js</code> ，代表 JavaScript，因为大多数 JVM 都附带了集成的 JavaScript 执行运行时。
				</p>
				<p>
					<code class="literal">enabled</code> 设置的默认值为 <code class="literal">true</code> ，因此编译器允许使用脚本。将 <code class="literal">enabled</code> 设置为 <code class="literal">false</code> 时，编译器将完全禁止使用脚本。
				</p>
				<p>此设置的示例 XML 配置如下所示：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;scripts default-dialect="js" enabled="true"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
				<p>设置新脚本方言的示例代码片段如下：</p>
				<pre>Configuration config = new Configuration();
config.getCompiler().getScripts().setDefaultDialect("js");
config.getCompiler().getScripts().setEnabled(true);</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-execution"></a>17.5.8. 与语句执行相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-execution-filterservicemaxfilterwidth"></a>17.5.8.1. 过滤器服务最大过滤器宽度</h4>
							</div>
						</div>
					</div>
					<p>
						编译器会分析过滤表达式，并确定 <code class="literal">OR</code> 逻辑运算符是否出现在过滤表达式中。此设置仅与那些包含 <code class="literal">OR</code> 的过滤表达式相关。更多信息请参阅 <a class="xref" href="apicompiler.html#apicompiler-filterplan" title="15.18. Compiler Filter Expression Analysis">15.18 节，“编译器过滤表达式分析”</a>。
					</p>
					<p>在默认配置中，该设置的值为 16，这意味着过滤表达式分析器最多可以从给定的过滤表达式创建 16 个路径表达式。如果路径表达式的数量超过 16，该表达式将被视为非路径表达式，并且不会被纳入过滤索引。</p>
					<p>在语句级别，可以通过提供提示来控制此设置。例如：</p>
					<pre>// 编译器将过滤表达式优化为：
//   "a=1, c=1" 或 "b=1, c=1" 或 "a=1, d=1" 或 "b=1, d=1"。
//   这使得过滤表达式之间可以共享过滤索引。
select * from Event((a=1 or b=1) and (c=1 or d=1))</pre>
					<pre>// 编译器不优化过滤表达式
@Hint('MAX_FILTER_WIDTH=0') select * from Event((a=1 or b=1) and (c=1 or d=1))</pre>
					<p>设置新值的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;execution filter-service-max-filter-width="100"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getExecution().
    setFilterServiceMaxFilterWidth(16);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-execution-filterindexplanning"></a>17.5.8.2. 过滤索引规划</h4>
							</div>
						</div>
					</div>
					<p>
						编译器会分析过滤表达式并确定是否使用过滤索引。更多信息请参阅 <a class="xref" href="apicompiler.html#apicompiler-filterplan" title="15.18. Compiler Filter Expression Analysis">15.18 节，“编译器过滤表达式分析”</a>。
					</p>
					<p>
						默认情况下，编译器执行高级规划。默认设置为 <code class="literal">ConfigurationCompilerExecution.FilterIndexPlanning.ADVANCED</code> 。
					</p>
					<p>
						此设置是一个枚举值，可以设置为 <code class="literal">none</code> 、<code class="literal">basic</code> 或 <code class="literal">advanced</code> （默认值）。
					</p>
					<p>
						将其设置为 <code class="literal">none</code> 时，编译器会简单地为任何过滤表达式构建一个不可重用的布尔复合表达式。
					</p>
					<p>
						将其设置为 <code class="literal">basic</code> 时，编译器会分析过滤表达式并构建基本的三元组。EPL 可以指定过滤索引规划提示，以启用应用程序所需的那些高级规划功能。
					</p>
					<p>
						将其设置为 <code class="literal">advanced</code> （默认值）时，编译器会全面分析过滤表达式。在这种情况下，编译器不会考虑过滤索引规划提示。
					</p>
					<p>XML 配置示例如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;execution filter-index-planning="advanced"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>更改此设置的 API 示例如下：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getExecution().setFilterIndexPlanning(
    ConfigurationCompilerExecution.FilterIndexPlanning.ADVANCED);</pre>
				</div>

				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-compiler-execution-declaredexprvaluecache"></a>17.5.8.3. 声明表达式值缓存</h4>
							</div>
						</div>
					</div>
					<p>
						<code class="literal">enable-declared-expr-value-cache</code> 默认值为 true，编译器会生成代码以使用声明表达式缓存。
					</p>
					<p>设置与默认值相同的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;execution enable-declared-expr-value-cache="true"/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getCompiler().getExecution().
    setEnabledDeclaredExprValueCache(true);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-compiler-serde"></a>17.5.9. 与序列化器和反序列化器相关的编译器设置</h3>
						</div>
					</div>
				</div>
				<p>与序列化器和反序列化器（serdes）相关的设置仅在使用 EsperHA 实现高可用性时才有意义。在不使用 EsperHA 的情况下，这些设置无关紧要。有关信息，请参阅 EsperHA 文档。</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;compiler&gt;
    &lt;serde-settings/&gt;
  &lt;/compiler&gt;
&lt;/esper-configuration&gt;</pre>
			</div>
		</div>
		<div class="sect1" lang="zh-CN">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-runtime"></a>17.6. 运行时配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e48758" class="indexterm"></a>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-threading"></a>17.6.1. 与并发和线程相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-threading-dispatch"></a>17.6.1.1. 保留传递给监听器的事件顺序</h4>
							</div>
						</div>
					</div>
					<p>在多线程环境中，此设置控制将语句结果事件分发到监听器时，是否保留语句处理事件的顺序。默认情况下，运行时保证按照结果生成的顺序将语句的结果事件传递给语句监听器。可以通过如下配置关闭此行为。此行为适用于有状态的语句，无状态的语句由于执行时无锁，因此不适用。</p>
					<p>接下来的代码片段展示了如何控制此功能：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getThreading().setListenerDispatchPreserveOrder(false);</pre>
					<p>XML 配置文件也可以通过添加以下元素来控制此功能：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading&gt;
      &lt;listener-dispatch preserve-order="true" timeout-msec="1000" locking="spin"/&gt;
    &lt;/threading&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>如前所述，默认情况下，运行时在将结果事件传递给监听器时，可能会暂时阻塞另一个处理线程，以保留结果传递给给定语句的顺序。运行时阻塞线程的最长时间也可以配置，默认设置为 1 秒。</p>
					<p>由于这种传递锁通常只保持很短的时间，默认的阻塞技术采用自旋锁（实现阻塞有两种技术：让操作系统挂起线程直到稍后唤醒，或者使用自旋锁）。虽然自旋锁会占用大量 CPU 资源，看起来效率不高，但对于保持时间很短的锁来说，自旋锁可能比挂起线程然后再唤醒它更高效。这是因为挂起和重新调度线程会有很大的开销。</p>
					<p>可以通过将 locking 属性设置为'suspend'，将锁定技术更改为使用挂起线程的阻塞策略。</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-threading-insertinto"></a>17.6.1.2. 保留插入到流中的事件顺序</h4>
							</div>
						</div>
					</div>
					<p>在多线程环境中，此设置控制通过 insert-into 为其他语句生成事件的语句，是否在生成和使用这些事件的语句之间保留事件传递顺序，从而在多线程应用程序中，当消费语句需要确定性时，让消费其他语句事件的语句表现出确定性。默认情况下，运行时会做出此保证（该设置为开启状态）。此行为适用于有状态的语句，无状态的语句由于执行时无锁，因此不适用。</p>
					<p>例如，在一个应用程序中，单个语句（S1）将事件插入到一个流中，另一个语句（S2）对该流进行进一步评估。多线程应用程序可能有多个线程将事件处理到语句 S1 中。当语句 S1 生成事件供语句 S2 消费时，这些结果可能需要按照生成的确切顺序传递，因为消费语句可能依赖于接收的顺序。例如，如果第一个语句统计事件的数量，第二个语句可能使用一个模式来检查计数，因此期望语句 S1 发布的计数即使在多个线程处理事件时也能连续增加 1。</p>
					<p>运行时可能需要阻塞一个线程以维持传递顺序，并且需要顺序的语句（如模式检测、previous 和 prior 函数）会收到确定性顺序的事件。可用的设置可以控制阻塞技术和参数。如前一节所述，默认的阻塞技术是对每个插入事件供消费的语句采用自旋锁，因为相关锁通常只保持很短的时间。也可以配置'suspend'阻塞技术，并定义一个超时值。</p>
					<p>XML 配置文件可以通过以下元素更改设置：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading&gt;
      &lt;insert-into-dispatch preserve-order="true" timeout-msec="100" locking="spin"/&gt;
    &lt;/threading&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-threading-namedwindowdispatch"></a>17.6.1.3. 保留命名窗口向消费语句分发事件的顺序</h4>
							</div>
						</div>
					</div>
					<p>
						在多线程环境中，此设置控制通过 <code class="literal">from</code> 子句为其他消费命名窗口的语句生成插入流和删除流的命名窗口，是否在生成命名窗口和消费语句之间保留事件传递顺序，从而在多线程应用程序中，当消费语句需要确定性时，让消费命名窗口插入流和删除流事件的语句表现出确定性。默认情况下，运行时通过自旋锁和 <code class="literal">Long.MAX_VALUE</code> 作为毫秒超时值来做出此保证（该设置为开启状态）。
					</p>
					<p>例如，在一个应用程序中，命名窗口（W1）生成插入流和删除流事件，语句（S1）消费这些事件。多线程应用程序可能有多个线程生成插入流和删除流事件供语句 S1 消费。这些结果可能需要按照命名窗口生成的确切顺序传递，因为消费语句可能依赖于接收的顺序。</p>
					<p>运行时可能需要阻塞一个线程以维持传递顺序，并且需要顺序的语句会收到确定性顺序的事件。可用的设置可以控制阻塞技术和参数。如前一节所述，默认的阻塞技术是对每个生成插入流和删除流事件供消费的命名窗口采用自旋锁，因为相关锁通常只保持很短的时间。也可以配置'suspend'阻塞技术，并定义一个超时值。</p>
					<p>XML 配置文件可以通过以下元素更改设置：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading&gt;
      &lt;named-window-consumer-dispatch preserve-order="true" locking="spin"/&gt;
    &lt;/threading&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-threading-internaltimer"></a>17.6.1.4. 内部定时器设置</h4>
							</div>
						</div>
					</div>
					<p>此选项可用于禁用内部定时器线程，从而让应用程序提供外部时间事件，还可以设置定时器分辨率。</p>
					<p>接下来的代码片段展示了如何通过配置 API 禁用内部定时器线程：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getThreading().setInternalTimerEnabled(false);</pre>
					<p>此 XML 配置片段保留内部定时器启用状态（默认设置），并将分辨率设置为 200 毫秒（默认值为 100 毫秒）：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading&gt;
      &lt;internal-timer enabled="true" msec-resolution="200"/&gt;
    &lt;/threading&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>我们建议在禁用内部定时器时，应用程序在创建语句之前发送一个设置了开始时间的外部定时器事件，以便明确语句的开始时间。</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-threading-advanced"></a>17.6.1.5. 高级线程选项</h4>
							</div>
						</div>
					</div>
					<p>此处描述的设置用于为入站、出站、定时器和路由执行启用高级线程选项。</p>
					<p>以下面的 XML 配置片段为例。它将所有线程选项配置为 2 个线程，这可能不适合您的应用程序，但可以演示配置方法：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading&gt;
      &lt;threadpool-inbound enabled="true" num-threads="2"/&gt;
      &lt;threadpool-outbound enabled="true" num-threads="2" capacity="1000"/&gt;
      &lt;threadpool-timerexec enabled="true" num-threads="2"/&gt;
      &lt;threadpool-routeexec enabled="true" num-threads="2"/&gt;
    &lt;/threading&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>
						默认情况下，队列是无界的，由 <code class="literal">java.util.concurrent.LinkedBlockingQueue</code> 支持。可以设置可选的 <code class="literal">capacity</code> 属性，指示线程选项配置一个具有发送方等待（阻塞放入）策略的有界容量队列，由 <code class="literal">ArrayBlockingQueue</code> 支持。
					</p>
					<p>此示例使用 API 配置入站线程：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getThreading().setThreadPoolInbound(true);
config.getRuntime().getThreading().setThreadPoolInboundNumThreads(2);</pre>
					<p>对于有界工作队列，队列大小和线程池大小应一起调整。大队列结合小线程池有助于减少内存使用、CPU 使用和上下文切换，但可能会限制吞吐量。</p>
					<div class="note">
						<h2>注意</h2>
						<p>
							如果启用了出站线程，将事件发送回运行时的监听器和订阅者应使用 <code class="literal">sendEvent<em>Type</em></code> 方法，而不是 <code class="literal">routeEvent</code> 方法。
						</p>
					</div>
				</div>

				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-runtimefairlock"></a>17.6.1.6. 运行时公平锁</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，运行时配置的运行时级别锁不使用公平锁。运行时级别锁用于协调事件处理线程（发送事件的线程）和执行管理功能的线程（例如部署和取消部署语句的线程）。一般来说，公平锁的性能比非公平锁差，因此默认配置为非公平锁。</p>
					<p>
						如果您的应用程序是多线程的，并且多个线程无间隙地发送事件，并且每个事件的处理时间较长，那么配置公平锁可以帮助优先处理管理功能。在管理功能完成之前，管理功能会排除事件处理线程。在并发事件处理的情况下，您可能需要设置此标志以防止执行管理功能时出现锁饥饿。有关更多信息，请参阅 <code class="literal">ReentrantReadWriteLock</code> 下的 Java API 文档和 <span class="emphasis"><em>公平模式</em></span>。
					</p>
					<p>启用公平锁的 XML 配置（默认情况下禁用）如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;threading runtime-fairlock="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getThreading().setRuntimeFairlock(true);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-logging"></a>17.6.2. 与日志记录相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-logging-execpath"></a>17.6.2.1. 执行路径调试日志记录</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，即使 Log4j 或日志记录器配置已设置为输出调试级别日志，运行时也不会为事件处理执行路径生成调试输出。要启用调试级别日志记录，需要在配置中以及 Log4j 配置文件中设置此选项。</p>
					<p>
						语句级别的处理信息可以通过 <code class="literal">@Audit</code> 注解输出，请参阅 <a class="xref" href="apicompiler.html#devlifecycle-debugging-audit" title="15.12.1. @Audit Annotation">15.12.1 节，“@Audit 注解”</a>。
					</p>
					<p>
						当通过如下设置标志并在 Log4j 配置文件中设置 DEBUG 来启用调试级别日志记录时，定时器处理可能会生成大量您可能不希望在日志文件中出现的调试输出。XML 中的 <code class="literal">timer-debug</code> 设置或通过如下 API 可禁用默认启用的定时器调试输出。
					</p>
					<p>用于启用调试日志记录并禁用定时器事件输出的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getLogging().setEnableExecutionDebug(true);
config.getRuntime().getLogging().setEnableTimerDebug(false);</pre>
					<p>注意：这是一个适用于给定 Java 模块或 VM 的所有运行时实例的配置选项。</p>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
      &lt;logging&gt;
        &lt;execution-path enabled="true"/&gt;
        &lt;timer-debug enabled="false"/&gt;
    &lt;/logging&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-logging-audit"></a>17.6.2.2. 审计日志记录</h4>
							</div>
						</div>
					</div>
					<p>
						此处的设置控制 <code class="literal">@Audit</code> 日志的输出格式。
					</p>
					<p>此设置适用于同一 JVM 中的所有运行时实例。另请参阅 API 文档以了解模式转换字符的信息。</p>
					<div class="table">
						<a id="d0e48930"></a>
						<p class="title">
							<b>表 17.5. 审计日志转换字符</b>
						</p>
						<div class="table-contents">
							<table summary="Audit Log Conversion Characters" border="1">
								<colgroup>
									<col>
									<col>
								</colgroup>
								<thead>
									<tr>
										<th>字符</th>
										<th>描述</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><code class="literal">m</code></td>
										<td>审计消息</td>
									</tr>
									<tr>
										<td><code class="literal">s</code></td>
										<td>语句名称</td>
									</tr>
									<tr>
										<td><code class="literal">u</code></td>
										<td>运行时 URI</td>
									</tr>
									<tr>
										<td><code class="literal">d</code></td>
										<td>部署 ID</td>
									</tr>
									<tr>
										<td><code class="literal">i</code></td>
										<td>上下文分区 ID</td>
									</tr>
									<tr>
										<td><code class="literal">c</code></td>
										<td>类别</td>
									</tr>
									<tr>
										<td><code class="literal">tutc</code></td>
										<td>以 ISO-8601 实例格式作为 UTC 值格式化的运行时时间</td>
									</tr>
									<tr>
										<td><code class="literal">tzone</code></td>
										<td>根据配置的时区，以 ISO-8601 实例格式作为带时区的值格式化的运行时时间</td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
					<p>用于设置审计日志格式的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getLogging().setAuditPattern("[%u] [%s] %m");</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;logging&gt;
      &lt;audit pattern="[%u] [%s]%m"/&gt;
    &lt;/logging&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-logging-lockactivity"></a>17.6.2.3. 锁活动日志记录</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，锁活动日志记录是禁用的。当启用锁活动日志记录时，运行时会在 INFO 级别以及包名 <code class="literal">com.espertech.esper.lock</code> 下输出有关读写锁活动的信息。输出内容包括：
					</p>
					<div class="itemizedlist">
						<ul>
							<li><code class="literal">Acquire</code>（在调用 <code class="literal">lock()</code> 之前），<code class="literal">Got</code>（在调用 <code class="literal">lock()</code> 之后），<code class="literal">Release</code>（在调用 <code class="literal">unlock()</code> 之前）以及 <code class="literal">Freed</code>（在调用 <code class="literal">unlock()</code> 之后）</li>
							<li>对于写锁为文本 <code class="literal">write</code>，对于读锁为文本 <code class="literal">read</code></li>
							<li>读写锁的系统标识哈希码</li>
							<li>EPL 语句名称</li>
							<li>上下文分区 ID，未分区时为 <code class="literal">-1</code></li>
							<li><code class="literal">tryLock</code> 超时毫秒数，不适用时为 <code class="literal">-1</code></li>
							<li>当前读锁计数</li>
							<li>一个布尔值，指示锁是否为写锁定</li>
						</ul>
					</div>
					<div class="note">
						<h2>注意</h2>
						<p>请注意，某些 EPL 语句无锁执行，因此不会产生锁活动输出。</p>
					</div>
					<p>用于启用调试日志记录并禁用定时器事件输出的 API 如下所示：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getLogging().setEnableLockActivity(true);</pre>
					<p>XML 片段如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
      &lt;logging&gt;
        &lt;lock-activity enabled="true"/&gt;
    &lt;/logging&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-variables"></a>17.6.3. 与变量相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-variables-lifetimeold"></a>17.6.3.1. 变量版本释放间隔</h4>
							</div>
						</div>
					</div>
					<p>此设置控制运行时保留变量版本的时间长度，以便供使用变量且在同一语句中针对同一事件执行时间超过该时间间隔的语句使用。默认情况下，运行时保留 15 秒的变量版本。</p>
					<p>
						对于使用变量且（响应单个定时器或其他事件）执行时间超过该时间段的语句，运行时会在语句执行时返回当前变量版本，从而放宽了长时间运行的语句中变量值一致性的保证。有关更多信息，请参阅 <a class="xref" href="epl_clauses.html#variable_using" title="5.17.3. Using Variables">5.17.3 节，“使用变量”</a>。
					</p>
					<p>此设置的 XML 配置如下所示：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;variables&gt;
      &lt;msec-version-release value="15000"/&gt;
    &lt;/variables&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-patterns"></a>17.6.4. 与模式相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-patterns-max"></a>17.6.4.1. 后续操作符的最大子表达式计数</h4>
							</div>
						</div>
					</div>
					<p>您可以使用此设置来限制所有后续操作符在整个运行时范围内可管理的模式子表达式的总数。当达到限制时，运行时会通过条件回调 API 引发一个条件。</p>
					<p>
						默认情况下，当达到限制时，运行时还会阻止新的模式子表达式启动，直到模式子表达式结束且不再达到限制。通过将 <code class="literal">prevent-start</code> 标志设置为 false，您可以指示运行时仅引发一个条件并继续允许新的模式子表达式启动。
					</p>
					<p>
						此处描述的设置的影响也在 <a class="xref" href="event_patterns.html#pattern-temporal-followed-by-runtime-max" title="7.5.8.2. Limiting Runtime-Wide Sub-Expression Count">7.5.8.2 节，“限制运行时范围内的子表达式计数”</a> 中详细说明。
					</p>
					<p>此设置的示例 XML 配置如下所示：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;patterns&gt;
      &lt;max-subexpression value="100" prevent-start="false"/&gt;
    &lt;/patterns&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-matchrecognize"></a>17.6.5. 与匹配识别（Match-Recognize）相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-matchrecognize-max"></a>17.6.5.1. 最大状态计数</h4>
							</div>
						</div>
					</div>
					<p>您可以使用此设置来限制所有匹配识别（Match-Recognize）构造在整个运行时范围内可管理的状态总数。当达到限制时，运行时会通过条件回调 API 引发一个条件。</p>
					<p>
						默认情况下，当达到限制时，运行时还会阻止分配新的状态，直到状态被移除且不再达到限制。通过将 <code class="literal">prevent-start</code> 标志设置为 false，您可以指示运行时仅引发一个条件并继续允许分配新的状态。
					</p>
					<p>
						此处描述的设置的影响也在 <a class="xref" href="match-recognize.html#match-recognize-state-max" title="8.11. Limiting Runtime-Wide State Count">8.11 节，“限制运行时范围内的状态计数”</a> 中详细说明。
					</p>
					<p>此设置的示例 XML 配置如下所示：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;match-recognize&gt;
      &lt;max-state value="100" prevent-start="false"/&gt;
    &lt;/match-recognize&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-timesource"></a>17.6.6. 与时间源相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-timesource-choices"></a>17.6.6.1. 默认时间源</h4>
							</div>
						</div>
					</div>
					<p>此设置仅在内部定时器事件控制运行时时间（默认情况）时适用。如果外部定时器事件提供运行时计时，则此设置不适用。</p>
					<p>
						默认情况下，内部定时器使用 <code class="literal">System.currentTimeMillis()</code> 调用来确定以毫秒为单位的运行时时间。通过此设置，可以指示内部定时器使用 <code class="literal">System.nanoTime()</code> 代替。有关更多信息，请参阅 <a class="xref" href="apiruntime.html#apiruntime-time-resolution" title="16.9.2. Time Resolution and Time Unit">16.9.2 节，“时间分辨率和时间单位”</a>。
					</p>
					<p>注意：这是一个 Java 虚拟机全局设置。出于性能原因，如果在 Java 虚拟机中运行多个运行时实例，定时器设置是全局的，适用于同一 Java 虚拟机中的所有运行时实例。</p>
					<p>此设置的示例 XML 配置如下，该示例设置将时间源设置为纳秒时间提供程序：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;time-source&gt;
      &lt;time-source-type value="nano" /&gt;
    &lt;/time-source&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>使用配置 API 的等效代码片段如下：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getTimeSource().setTimeSourceType(TimeSourceType.NANO);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-jmxmetrics"></a>17.6.7. 与 JMX 指标相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<p>请按此处所述设置标志，以便运行时通过 JMX MBean 平台服务器报告关键计数器和其他处理信息。默认情况下，JMX 未启用。对于 NEsper .NET，本节不适用，目前也没有等效功能。</p>
				<p>示例 XML 配置如下：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;metrics-reporting jmx-runtime-metrics="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				<p>通过 API 设置此配置的示例代码片段如下：</p>
				<pre>Configuration configuration = new Configuration();
configuration.getRuntime().getMetricsReporting().setJmxRuntimeMetrics(true);</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-metricsreporting"></a>17.6.8. 与指标报告相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<p>
					本节解释如何启用和配置指标报告，默认情况下指标报告是禁用的。有关报告给应用程序的指标数据的更多信息，请参阅 <a class="xref" href="apiruntime.html#apiruntime-instrumentation" title="16.12. Runtime and Statement Metrics Reporting">16.12 节，“运行时和语句指标报告”</a>。
				</p>
				<p>启用指标报告的标志对 Java 虚拟机是全局的。如果启用了指标报告，报告指标所产生的开销将由每个 Java 虚拟机中的所有运行时实例承担。</p>
				<p>如果启用了指标报告和线程（默认启用线程），则在运行时初始化时，每个运行时实例会启动一个由运行时控制的单独守护线程来进行指标报告。</p>
				<p>运行时和语句指标的间隔以毫秒为单位。可以提供负数或零毫秒的间隔值来禁用报告。</p>
				<p>为了控制单个语句或语句组的语句指标报告，运行时提供了一种按语句名称对语句进行分组的功能。每个这样的语句组可以配置不同的报告间隔，并且可以在运行时通过运行时配置更改间隔。在配置时会为语句组分配一个组名以标识该组。</p>
				<p>
					指标报告配置是运行时设置的一部分。所有配置选项也可以通过 <code class="literal">Configuration</code> API 获得。
				</p>
				<p>示例 XML 配置如下：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;metrics-reporting enabled="true" runtime-interval="1000" statement-interval="1000" 
        threading="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					<code class="literal">runtime-interval</code> 设置（默认为 10 秒）确定运行时报告运行时指标的频率（以毫秒为单位），在此示例中为每秒一次。<code class="literal">statement-interval</code> 用于语句指标。<code class="literal">threading</code> 标志默认值为 true，因为报告由一个专用的运行时线程进行，可以将其设置为 false 以使用外部或内部定时器线程代替。
				</p>
				<p>下一个示例 XML 声明了一个语句组：属于该组的语句名称的语句遵循不同的报告频率：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;metrics-reporting enabled="true" statement-interval="0"&gt;
      &lt;stmtgroup name="MyStmtGroup" interval="2000" default-include="true" num-stmts="100" 
           report-inactive="true"&gt;
        &lt;exclude-regex&gt;.*test.*&lt;/exclude-regex&gt;
      &lt;/stmtgroup&gt;
    &lt;/metrics-reporting&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				<p>
					上述示例配置将 <code class="literal">statement-interval</code> 设置为零以禁用所有语句的报告。它定义了一个名为 <code class="literal">MyStmtGroup</code> 的语句组，并指定了 2 秒的间隔。该示例将 <code class="literal">default-include</code> 标志设置为 true（默认值为 false）以将所有语句包含在语句组中。该示例还将 <code class="literal">report-inactive</code> 设置为 true（默认值为 false）以报告非活动语句。
				</p>
				<p>
					<code class="literal">exclude-regex</code> 元素可用于指定一个正则表达式，用于从组中排除语句。任何语句名称与排除正则表达式匹配的语句都不包含在该组中。在上述示例中，所有语句名称中包含字符 'test' 的语句都被排除在该组之外。
				</p>
				<p>任何不属于任何语句组的语句都遵循配置的语句间隔。</p>
				<p>
					还有其他可用元素用于包含和排除语句：<code class="literal">include-regex</code>、<code class="literal">include-like</code> 和 <code class="literal">exclude-like</code>。后两者应用 SQL 类似的匹配。所有模式都是区分大小写的。
				</p>
				<p>
					以下是一个可能的语句组定义的进一步示例，该示例包含语句名称中包含字符 <code class="literal">@REPORT</code> 或 <code class="literal">@STREAM</code> 的语句，并排除语句名称中包含字符 <code class="literal">@IGNORE</code> 或 <code class="literal">@METRICS</code> 的语句。
				</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
					  &lt;runtime&gt;
					    &lt;metrics-reporting enabled="true"&gt;
					      &lt;stmtgroup name="MyStmtGroup" interval="1000"&gt;
					        &lt;include-like&gt;%@REPORT%&lt;/include-like&gt;
					        &lt;include-regex&gt;.*@STREAM.*&lt;/include-regex&gt;
					        &lt;exclude-like&gt;%@IGNORE%&lt;/exclude-like&gt;
					        &lt;exclude-regex&gt;.*@METRICS.*&lt;/exclude-regex&gt;
					      &lt;/stmtgroup&gt;
					    &lt;/metrics-reporting&gt;
					  &lt;/runtime&gt;
					&lt;/esper-configuration&gt;</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-expression"></a>17.6.9. 与表达式求值相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-expression-subselecteval"></a>17.6.9.1. 子查询求值顺序</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，运行时在计算包含语句之前，会用新事件更新子查询。这对于在 <code class="literal">from</code> 子句和子查询中查找相同事件的语句很重要。
					</p>
					<p>要使运行时在子查询表达式中更新子查询之前计算包含子句，请按此处所示设置标志。</p>
					<p>如下的 XML 配置设置与默认值相同：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;expression self-subselect-preeval="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>以下是一个对相同事件使用子查询的示例语句：</p>
					<pre>select * from MyEvent where prop not in (select prop from MyEvent#unique(otherProp))</pre>
					<p>
						默认情况下，在计算 <code class="literal">where</code> 子句之前，子查询数据窗口会先更新，因此上述语句永远不会返回结果。
					</p>
					<p>
						更改此处描述的设置会导致在子查询数据窗口更新之前计算 <code class="literal">where</code> 子句，从而使该语句会产生结果。
					</p>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-expression-timezone"></a>17.6.9.2. 时区</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，在执行日历操作时，运行时使用 <code class="literal">java.util.TimeZone.getDefault()</code> 获取的默认时区。使用此处的设置可以指定除默认时区之外的其他时区。
					</p>
					<p>以下 XML 配置设置时区为 'GMT - 4:00'：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;expression time-zone="GMT-4:00"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>接下来是一个示例 API 配置：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExpression().setTimeZone(TimeZone.getTimeZone("GMT-4:00"));</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-execution"></a>17.6.10. 与语句执行相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-prioritized"></a>17.6.10.1. 优先级执行</h4>
							</div>
						</div>
					</div>
					<p>默认情况下，运行时会忽略 @Priority 和 @Drop 注解，并以无优先级的方式执行，即运行时不会尝试解释分配的优先级，也不会根据优先级重新排序执行。如果您的应用程序需要优先级执行，请使用此设置。</p>
					<p>
						通过设置此配置，当一个事件或调度匹配多个语句时，运行时会根据分配的优先级执行语句，从最高优先级值开始。请参阅 <a class="xref" href="epl_clauses.html#epl-syntax-annotation-priority" title="5.2.7.7. @Priority">5.2.7.7 节，“@Priority”</a> 中的内置 EPL 注解。
					</p>
					<p>启用该标志（默认情况下禁用）的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution prioritized="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExecution().setPrioritized(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-eventprecedence"></a>17.6.10.2. 事件优先级执行</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，运行时会忽略 <code class="literal">event-precedence</code>。这是因为跟踪事件优先级可能会有轻微的性能开销。
					</p>
					<p>如果您的应用程序需要根据事件优先级对 insert - into 事件进行处理排序，请使用此设置。启用此设置意味着运行时会确保工作队列中的事件按事件优先级排序。</p>
					<p>
						有关工作队列和事件处理顺序的更多信息，请参阅 <a class="xref" href="apiruntime.html#apiruntime-processingorder-eventdepth" title="16.8.2.2. Processing Principles of Events and Listener Updates">16.8.2.2 节，“事件和监听器更新的处理原则”</a>。
					</p>
					<p>
						有关 <code class="literal">event-precedence</code> 关键字的更多信息，请参阅 <a class="xref" href="epl_clauses.html#insert-into-eventprecedence" title="5.10.10. Insert Into and Event Precedence">5.10.10 节，“Insert Into 和事件优先级”</a>。
					</p>
					<p>启用该标志（默认情况下禁用）的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution precedence-enabled="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExecution().setPrecedenceEnabled(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-fairlock"></a>17.6.10.3. 上下文分区公平锁</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，运行时配置的上下文分区锁不使用公平锁。如果您的应用程序是多线程的，并且通过迭代器或即发即忘查询进行非常频繁的读取，您可能需要设置此标志，以防止在并发读写情况下出现锁饥饿。有关更多信息，请参阅 <code class="literal">ReentrantReadWriteLock</code> 下的 Java API 文档和 <span class="emphasis"><em>公平模式</em></span>。
					</p>
					<p>启用公平锁（默认情况下禁用）的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution fairlock="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExecution().setFairlock(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-disablelock"></a>17.6.10.4. 禁用锁</h4>
							</div>
						</div>
					</div>
					<p>
						默认情况下，运行时在分析您的语句后根据需要配置上下文分区锁。您可以使用此处描述的设置禁用上下文分区锁。请使用 <code class="literal">@NoLock</code> 注解仅为给定的语句或命名窗口禁用锁。
					</p>
					<div class="warning">
						<h2>警告</h2>
						<p>运行时提供此设置是为了识别锁开销，或者当您的应用程序是单线程的，或者当使用外部机制进行并发控制时。除非您的应用程序考虑了并发问题，否则将 disable - locking 设置为 true 可能会产生不可预测的结果。</p>
					</div>
					<p>禁用上下文级别锁的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution disable-locking="true"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExecution().setDisableLocking(true);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-filterserviceprofile"></a>17.6.10.5. 过滤器服务配置文件</h4>
							</div>
						</div>
					</div>
					<p>此设置用于对过滤器服务进行性能调优，该服务负责将传入的事件与上下文分区和语句进行匹配。</p>
					<p>
						在称为 <code class="literal">readmostly</code> 的默认配置中，假设存在大量的读取操作和相对较少的写入操作，过滤器服务锁是粗粒度的。“读取” 指的是对事件的求值，而 “写入” 是指过滤器服务的更改，例如新语句的添加、新的模式子表达式激活或模式子表达式停用。
					</p>
					<p>
						例如，如果您的应用程序有多个线程，并且您的语句非常频繁地使用模式子表达式添加和删除过滤器，请将配置设置为 <code class="literal">readwrite</code>。此设置指示运行时维护细粒度的锁，通常可以实现更高的并发性，但可能会产生额外的开销。
					</p>
					<p>设置新的过滤器服务配置文件的 XML 配置如下：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution filter-service-profile="readwrite"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration = new Configuration();
config config.getRuntime().getExecution().
    setFilterServiceProfile(FilterServiceProfile.READWRITE);</pre>
				</div>
				<div class="sect3" lang="zh-CN">
					<div class="titlepage">
						<div>
							<div>
								<h4 class="title"><a id="configuration-runtime-execution-declaredexprvaluecachesize"></a>17.6.10.6. 声明表达式值缓存大小</h4>
							</div>
						</div>
					</div>
					<p>在默认配置中，此设置的值为 1，这意味着对于每个声明的表达式，运行时仅保留最后计算值的缓存，以便在针对上下文分区对事件或时间进行求值期间使用。您可以将该值设置为 0 以禁用缓存。您可以将该值设置为 N，以指示运行时保留最后 N 个计算值的缓存。此设置不适用于有状态的声明表达式，例如带有聚合函数的声明表达式。</p>
					<p>运行时仅对将事件作为参数接收的表达式使用声明表达式缓存。对于将其他值作为参数接收的表达式，运行时不会使用声明表达式缓存。</p>
					<p>设置与默认值相同的 XML 配置：</p>
					<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;execution declared-expr-value-cache-size="1"/&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
					<p>用于更改此设置的 API：</p>
					<pre>Configuration config = new Configuration();
config.getRuntime().getExecution().
    setDeclaredExprValueCacheSize(1);</pre>
				</div>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-exceptionhandling"></a>17.6.11. 与异常处理相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<p>
					使用此处描述的设置来注册一个提供异常处理程序的异常处理程序工厂类。运行时会按照列出的顺序调用异常处理程序来处理连续查询的未检查异常，如 <a class="xref" href="apiruntime.html#apiruntime-exception" title="16.10. Exception Handling">16.10 节，“异常处理”</a> 中进一步描述的那样。请在运行时配置中提供实现 <code class="literal">com.espertech.esper.common.client.hook.exception.ExceptionHandlerFactory</code> 接口的每个类的全限定类名，如下所示。
				</p>
				<p>
					默认情况下，在模块取消部署期间，当运行时遇到任何语句的运行时异常时，它会将此类异常记录为警告。您可以将 <code class="literal">undeploy-rethrow-policy</code> 标志设置为 <code class="literal">rethrow_first</code>，以使运行时重新抛出第一个运行时异常。
				</p>
				<p>XML 配置如下：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;exceptionHandling undeploy-rethrow-policy="warn"&gt;
      &lt;handlerFactory class="my.company.cep.MyCEPRuntimeExceptionHandlerFactory"/&gt;
    &lt;/exceptionHandling&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				<p>注册异常处理程序工厂的 API 调用如下：</p>
				<pre>Configuration config = new Configuration();
config.getRuntime().getExceptionHandling().addClass(MyCEPRuntimeExceptionHandlerFactory.class);
config.getRuntime().getExceptionHandling().setUndeployRethrowPolicy(UndeployRethrowPolicy.RETHROW_FIRST);</pre>
				<div class="tip">
					<h2>提示</h2>
					<p>
						应用程序提供的异常处理程序会接收一个 <code class="literal">ExceptionHandlerContext</code> 实例，其中包含异常详细信息。执行日志记录的应用程序代码应记录详细信息，如部署和语句信息。这些信息对于排查异常可能很有用。
					</p>
					<p>供参考，下面是运行时默认异常处理代码的一段摘录。</p>
				</div>
				<p>供参考，我们在此处包含默认的异常处理代码：</p>
				<pre>if (exceptionHandlers.isEmpty()) {
  StringWriter writer = new StringWriter();
  if (type == ExceptionHandlerExceptionType.PROCESS) {
    writer.append("Exception encountered processing ");
  } else {
    writer.append("Exception encountered performing instance stop for ");
  }
  writer.append("deployment-id '");
  writer.append(deploymentId);
  writer.append("' ");
  writer.append("statement '");
  writer.append(statementName);
  writer.append("'");
  if (optionalEPL != null) {
    writer.append(" expression '");
    writer.append(optionalEPL);
    writer.append("'");
  }
  writer.append(" : ");
  writer.append(t.getMessage());
  String message = writer.toString();

  if (type == ExceptionHandlerExceptionType.PROCESS) {
    log.error(message, t);
  } else {
    log.warn(message, t);
  }
  return;
}

ExceptionHandlerContext context = new ExceptionHandlerContext(runtimeURI, t, deploymentId, statementName, optionalEPL, type, optionalCurrentEvent);
for (ExceptionHandler handler : exceptionHandlers) {
  handler.handle(context);
}</pre>
				<p></p>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-runtime-conditionhandling"></a>17.6.12. 与条件处理相关的运行时设置</h3>
						</div>
					</div>
				</div>
				<p>
					使用此处描述的设置来注册一个提供条件处理程序的条件处理程序工厂类。运行时会按照列出的顺序调用条件处理程序来指示条件，当达到某些预定义的限制时，会使用 “条件” 这个术语进行通知，如 <a class="xref" href="apiruntime.html#apiruntime-condition" title="16.11. Condition Handling">16.11 节，“条件处理”</a> 中进一步描述的那样。
				</p>
				<p>
					请在运行时配置中提供实现 <code class="literal">com.espertech.esper.common.client.hook.condition.ConditionHandlerFactory</code> 接口的每个类的全限定类名，如下所示。
				</p>
				<p>XML 配置如下：</p>
				<pre>&lt;esper-configuration xmlns="http://www.espertech.com/schema/esper"&gt;
  &lt;runtime&gt;
    &lt;conditionHandling&gt;
      &lt;handlerFactory class="my.company.cep.MyCEPRuntimeConditionHandlerFactory"/&gt;
    &lt;/conditionHandling&gt;
  &lt;/runtime&gt;
&lt;/esper-configuration&gt;</pre>
				<p>注册条件处理程序工厂的 API 调用如下：</p>
				<pre>Configuration config = new Configuration();
config.getRuntime().getConditionHandling().addClass(MyCEPRuntimeConditionHandlerFactory.class);</pre>
			</div>
		</div>
		<div class="sect1" lang="zh-CN">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-transientobjects"></a>17.7. 传递服务或瞬态对象</h2>
					</div>
				</div>
			</div>
			<a id="d0e49492" class="indexterm"></a>
			<p>
				<code class="literal">Configuration</code> 对象允许传递应用程序对象，如服务或其他瞬态对象。例如，扩展、监听器或订阅者可以使用这些信息从运行时获取应用程序对象。您的应用程序可以提供自定义类加载器或类名解析服务。
			</p>
			<p>
				使用 <code class="literal">setTransientConfiguration</code> 并提供一个 <code class="literal">Map&lt;String, Object&gt;</code>，其中包含应用程序对象。运行时会保留该 <code class="literal">Map</code> 实例，并通过 API 使其可用。应用程序可以在运行时更改其内容，包括服务。用于检索瞬态配置的 API 方法有：
			</p>
			<div class="itemizedlist">
				<ul>
					<li>
						<p>
							<code class="literal">EPRuntime</code> 的 <code class="literal">getConfigurationTransients</code> 方法
						</p>
					</li>
					<li>
						<p>
							<code class="literal">EPRuntime</code> 的 <code class="literal">getConfigurationDeepCopy</code> 方法
						</p>
					</li>
				</ul>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-transientobjects-service"></a>17.7.1. 服务示例</h3>
						</div>
					</div>
				</div>
				<p>
					假设您的应用程序有一个 <code class="literal">myLocalService</code> 实例服务，示例代码如下：
				</p>
				<pre>Configuration configuration = new Configuration();
HashMap&lt;String, Object&gt; transients = new HashMap&lt;String, Object&gt;();
transients.put(SERVICE_NAME, myLocalService); // SERVICE_NAME 是在其他地方定义的一个已知字符串值
configuration.getCommon().setTransientConfiguration(transients);

EPRuntime runtime = EPRuntimeProvider.getDefaultRuntime(configuration);</pre>
				<p>一个从瞬态配置中接收服务的示例监听器如下：</p>
				<pre>public class MyListener implements UpdateListener {
  public void update(EventBean[] newEvents, EventBean[] oldEvents, EPStatement statement, EPRuntime runtime) {
    MyLocalService service = (MyLocalService) runtime.getConfigurationTransient().get(SERVICE_NAME);
    // 在此处使用该服务
  }
}</pre>
				<p>获取应用程序服务的另一种方法是定义一个常量变量。</p>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-transientobjects-classforname"></a>17.7.2. 类名解析</h3>
						</div>
					</div>
				</div>
				<p>
					默认情况下，当将全限定类名解析为 <code class="literal">Class</code> 时，<code class="literal">com.espertech.esper.common.client.util.ClassForNameProviderDefault</code> 使用：
				</p>
				<pre>ClassLoader cl = Thread.currentThread().getContextClassLoader();
return Class.forName(className, true, cl);</pre>
				<p>
					您的应用程序可以实现 <code class="literal">com.espertech.esper.common.client.util.ClassForNameProvider</code> 接口以提供替代实现。
				</p>
				<p>
					例如，此提供程序可防止 <code class="literal">System</code> 类在 EPL 中可用：
				</p>
				<pre>runtime.getConfigurationTransient().put(ClassForNameProvider.NAME,
  new ClassForNameProvider() {
    public Class classForName(String className) throws ClassNotFoundException {
      if (className.equals(System.class.getName())) { // 防止加载 System 类
        return null;
      }
      return Class.forName(className, true, Thread.currentThread().getContextClassLoader());
   }
});</pre>
			</div>
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-transientobjects-classloader"></a>17.7.3. 类加载器</h3>
						</div>
					</div>
				</div>
				<p>
					默认情况下，为了获取类加载器，<code class="literal">com.espertech.esper.common.client.util.ClassLoaderProviderDefault</code> 使用 <code class="literal">Thread.currentThread().getContextClassLoader()</code>。
				</p>
				<p>
					您的应用程序可以实现 <code class="literal">com.espertech.esper.common.client.util.ClassLoaderProvider</code> 接口以提供替代实现。
				</p>
				<p>例如，此提供程序返回一个预先确定的类加载器：</p>
				<pre>ClassLoader classLoader = new CustomClassLoader();
runtime.getConfigurationTransient().put(ClassLoaderProvider.NAME,
  new ClassLoaderProvider() {
    public ClassLoader classloader() {
      return classLoader;
    }
});</pre>
			</div>
		</div>
		<div class="sect1" lang="zh-CN">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-type-names"></a>17.8. 类型名称</h2>
					</div>
				</div>
			</div>
			<p>某些配置值接受类型名称。例如，类型名称可能出现在变量类型、Map 事件属性类型以及 XPath 转换类型的配置中。类型名称不区分大小写。</p>
			<p>下表概述了所有可能的类型名称：</p>
			<div class="table">
				<a id="d0e49598"></a>
				<p class="title">
					<b>表 17.6. 变量类型名称</b>
				</p>
				<div class="table-contents">
					<table summary="Variable Type Names" border="1">
						<colgroup>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>类型名称</th>
								<th>类型</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td><code class="literal">string</code>, <code class="literal">varchar</code>, <code class="literal">varchar2</code> 或 <code class="literal">java.lang.String</code></td>
								<td>字符串值</td>
							</tr>
							<tr>
								<td><code class="literal">int</code>, <code class="literal">integer</code> 或 <code class="literal">java.lang.Integer</code></td>
								<td>整数值</td>
							</tr>
							<tr>
								<td><code class="literal">long</code> 或 <code class="literal">java.lang.Long</code></td>
								<td>长整数值</td>
							</tr>
							<tr>
								<td><code class="literal">bool</code>, <code class="literal">boolean</code> 或 <code class="literal">java.lang.Boolean</code></td>
								<td>布尔值</td>
							</tr>
							<tr>
								<td><code class="literal">double</code> 或 <code class="literal">java.lang.Double</code></td>
								<td>双精度浮点数值</td>
							</tr>
							<tr>
								<td><code class="literal">float</code> 或 <code class="literal">java.lang.Float</code></td>
								<td>单精度浮点数值</td>
							</tr>
							<tr>
								<td><code class="literal">short</code> 或 <code class="literal">java.lang.Short</code></td>
								<td>短整数值</td>
							</tr>
							<tr>
								<td><code class="literal">char</code>, <code class="literal">character</code> 或 <code class="literal">java.lang.Character</code></td>
								<td>字符值</td>
							</tr>
							<tr>
								<td><code class="literal">byte</code> 或 <code class="literal">java.lang.Byte</code></td>
								<td>字节值</td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
		</div>
		<div class="sect1" lang="zh-CN">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="configuration-logging"></a>17.9. 日志配置</h2>
					</div>
				</div>
			</div>
			<a id="d0e49710" class="indexterm"></a>
			<p>
				对于 NEsper .NET，另请参阅 <a class="xref" href="appendix_dotnet.html#appendix_dotnet_configuration_logging" title="J.18..NET Configurations - Logging Configuration">J.18 节，“.NET 配置 - 日志配置”</a>。
			</p>
			<p>编译器和运行时会在适当的日志级别下将所有消息记录到 SLF4J。要输出日志消息，您可以将 Log4j 和 SLF4J-Log4j (1.2) 添加到类路径中，并按如下方式配置 Log4j。</p>
			<p>
				日志记录的唯一直接依赖项是 SLF4J 接口（<code class="literal">slf4j-api-x.y.z.jar</code>）。请参阅 SLF4J 文档以了解如何将日志重定向到其他日志框架。
			</p>
			<p>
				可以输出语句级别的处理信息，请参阅 <a class="xref" href="apicompiler.html#devlifecycle-debugging-audit" title="15.12.1. @Audit Annotation">15.12.1 节，“@Audit 注解”</a>。
			</p>
			<p>
				出于性能原因，除非通过 <a class="xref" href="configuration.html#configuration-runtime-logging-execpath" title="17.6.2.1. Execution Path Debug Logging">17.6.2.1 节，“执行路径调试日志记录”</a> 显式配置，否则运行时不会记录任何事件执行的调试级别或信息级别的消息。
			</p>
			<p>
				如 <a class="xref" href="apiruntime.html#apiruntime-exception" title="16.10. Exception Handling">16.10 节，“异常处理”</a> 中所述，有一个用于接收某些关键运行时报告的回调 API 可用。
			</p>
			<p>
				有关配置运行时级别日志记录设置的更多信息，请参阅 <a class="xref" href="configuration.html#configuration-runtime-logging" title="17.6.2. Runtime Settings Related to Logging">17.6.2 节，“与日志记录相关的运行时设置”</a>。
			</p>
			<p>下一个表解释了日志级别：</p>
			<div class="table">
				<a id="d0e49744"></a>
				<p class="title">
					<b>表 17.7. 日志级别</b>
				</p>
				<div class="table-contents">
					<table summary="Log Levels" border="1">
						<colgroup>
							<col>
							<col>
						</colgroup>
						<thead>
							<tr>
								<th>日志级别</th>
								<th>用途</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td>调试（Debug）</td>
								<td>显示详细的运行时内部信息，这些信息对于应用程序开发人员来说可能不容易理解，但对运行时支持很有用。</td>
							</tr>
							<tr>
								<td>信息（Info）</td>
								<td>用于一些关键的运行时级别日志消息。</td>
							</tr>
							<tr>
								<td>警告（Warn）</td>
								<td>某些重要的警告或信息性消息会在警告级别下显示。</td>
							</tr>
							<tr>
								<td>错误（Error）</td>
								<td>运行时内部或插件组件报告的异常会在错误级别下报告。</td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
			<div class="sect2" lang="zh-CN">
				<div class="titlepage">
					<div>
						<div>
							<h3 class="title"><a id="configuration-logging-log4j"></a>17.9.1. Log4j 日志配置</h3>
						</div>
					</div>
				</div>
				<p>
					Log4j 是默认的日志记录组件。有关 Log4j 配置和扩展的更多信息，请访问 <a class="link" href="http://logging.apache.org/log4j" target="">http://logging.apache.org/log4j</a>。
				</p>
				<p>
					配置 Log4j 最简单的方法是提供一个 Log4J 配置文件，类似于发行版的 <code class="literal">etc</code> 文件夹中附带的 <code class="literal">log4j.xml</code> 文件。
				</p>
				<p>
					将 <code class="literal">log4j.configuration</code> 系统属性添加到 <code class="literal">java</code> 命令行中，并提供 Log4j 配置文件的文件名，确保您的类路径也包含该文件所在的目录：
				</p>
				<pre>java -Dlog4j.configuration=log4j.xml ...</pre>
			</div>
		</div>
	</div>
	<ul class="docnav">
		<li class="previous"><a accesskey="p" href="apiruntime.html"><strong>上一页</strong>第 16 章. 运行时参考</a></li>
		<li class="up"><a accesskey="u" href="#"><strong>返回顶部</strong></a></li>
		<li class="home"><a accesskey="h" href="index.html"><strong>首页</strong></a></li>
		<li class="next"><a accesskey="n" href="inlinedclass.html"><strong>下一页</strong>第 18 章. 内联类</a></li>
	</ul>
</body>

</html>